24c6c1 | 2000-02-20 | Martin Nilsson | |
|
b0a9ea | 2001-04-18 | Martin Stjernholm | | constant cvs_version = "$Id: configuration.pike,v 1.426 2001/04/18 04:25:08 mast Exp $";
|
b1fca0 | 1996-11-12 | Per Hedbor | | #include <module.h>
|
a59d25 | 2000-07-04 | Per Hedbor | | #include <module_constants.h>
|
14179b | 1997-01-29 | Per Hedbor | | #include <roxen.h>
|
c5e096 | 1999-10-04 | Per Hedbor | | #include <request_trace.h>
|
9c1900 | 2001-02-27 | Per Hedbor | | #include <timers.h>
|
8afc81 | 1998-02-04 | Per Hedbor | |
|
c7a5f0 | 1999-02-16 | Per Hedbor | | #define CATCH(P,X) do{mixed e;if(e=catch{X;})report_error("While "+P+"\n"+describe_backtrace(e));}while(0)
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | |
|
23414a | 2000-07-21 | Andreas Lange | |
#define LOC_S(X,Y) _STR_LOCALE("roxen_start",X,Y)
#define LOC_C(X,Y) _STR_LOCALE("roxen_config",X,Y)
#define LOC_M(X,Y) _STR_LOCALE("roxen_message",X,Y)
#define DLOCALE(X,Y) _DEF_LOCALE("roxen_config",X,Y)
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | #ifdef THROTTLING_DEBUG
#undef THROTTLING_DEBUG
|
91d3c3 | 2001-03-12 | Martin Nilsson | | #define THROTTLING_DEBUG(X) report_debug("Throttling: "+X+"\n")
|
199d03 | 1999-09-05 | Francesco Chemolli | | #else
#define THROTTLING_DEBUG(X)
#endif
|
10c7e1 | 1999-12-28 | Martin Nilsson | | #ifdef REQUEST_DEBUG
|
91d3c3 | 2001-03-12 | Martin Nilsson | | # define REQUEST_WERR(X) report_debug("CONFIG: "+X+"\n")
|
10c7e1 | 1999-12-28 | Martin Nilsson | | #else
# define REQUEST_WERR(X)
#endif
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | inherit Configuration;
inherit "basic_defvar";
|
dfe036 | 2000-03-19 | Martin Nilsson | |
|
d09399 | 2000-09-25 | Per Hedbor | |
class DataCache
{
mapping(string:array(string|mapping(string:mixed))) cache = ([]);
int current_size;
int max_size;
int max_file_size;
int hits, misses;
void flush()
{
current_size = 0;
cache = ([]);
}
static void clear_some_cache()
{
array q = indices( cache );
if(!sizeof(q))
{
current_size=0;
return;
}
for( int i = 0; i<sizeof( q )/10; i++ )
expire_entry( q[random(sizeof(q))] );
}
void expire_entry( string url )
{
if( cache[ url ] )
{
current_size -= strlen(cache[url][0]);
m_delete( cache, url );
}
}
void set( string url, string data, mapping meta, int expire )
{
if( strlen( data ) > max_size ) return;
call_out( expire_entry, expire, url );
current_size += strlen( data );
cache[url] = ({ data, meta });
int n;
while( (current_size > max_size) && (n++<10))
clear_some_cache();
}
array(string|mapping(string:mixed)) get( string url )
{
mixed res;
if( res = cache[ url ] )
hits++;
else
misses++;
return res;
}
void init_from_variables( )
{
max_size = query( "data_cache_size" ) * 1024;
max_file_size = query( "data_cache_file_max_size" ) * 1024;
if( max_size < max_file_size )
max_size += max_file_size;
int n;
while( (current_size > max_size) && (n++<10))
clear_some_cache();
}
static void create()
{
init_from_variables();
}
}
|
3b1783 | 1998-11-22 | Per Hedbor | | #include "rxml.pike";
|
9a8a15 | 2000-09-25 | Per Hedbor | | constant store = roxen.store;
constant retrieve = roxen.retrieve;
constant remove = roxen.remove;
|
14179b | 1997-01-29 | Per Hedbor | |
|
65c6d2 | 2000-03-10 | Martin Nilsson | | int config_id;
|
9a8a15 | 2000-09-25 | Per Hedbor | | int get_config_id()
{
|
65c6d2 | 2000-03-10 | Martin Nilsson | | if(config_id) return config_id;
for(int i=sizeof(roxen->configurations); i;)
if(roxen->configurations[--i]->name==name) return config_id=i;
}
|
c7a5f0 | 1999-02-16 | Per Hedbor | | string get_doc_for( string region, string variable )
{
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule module;
|
c7a5f0 | 1999-02-16 | Per Hedbor | | if(variable[0] == '_')
return 0;
if((int)reverse(region))
return 0;
if(module = find_module( region ))
{
if(module->variables[variable])
|
b2c49b | 2000-07-09 | Per Hedbor | | return module->variables[variable]->name()+
"\n"+module->variables[ variable ]->doc();
|
c7a5f0 | 1999-02-16 | Per Hedbor | | }
if(variables[ variable ])
|
b2c49b | 2000-07-09 | Per Hedbor | | return variables[variable]->name()+
"\n"+variables[ variable ]->doc();
|
c7a5f0 | 1999-02-16 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
e351dd | 1999-11-29 | Per Hedbor | | string query_internal_location(RoxenModule|void mod)
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
|
8552d9 | 2001-01-13 | Martin Nilsson | | return query("InternalLoc")+(mod?replace(otomod[mod]||"", "#", "!")+"/":"");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | }
|
b1fca0 | 1996-11-12 | Per Hedbor | |
string query_name()
{
|
8552d9 | 2001-01-13 | Martin Nilsson | | if(strlen(query("name")))
return query("name");
|
b1fca0 | 1996-11-12 | Per Hedbor | | return name;
}
string comment()
{
|
8552d9 | 2001-01-13 | Martin Nilsson | | return query("comment");
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
e351dd | 1999-11-29 | Per Hedbor | | array (Priority) allocate_pris()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
|
c5e096 | 1999-10-04 | Per Hedbor | | return allocate(10, Priority)();
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
7a243b | 2000-08-19 | Per Hedbor | | private mapping (int:string) log_format = ([]);
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
053a55 | 2000-10-04 | Per Hedbor | | array (Priority) pri = allocate_pris();
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | mapping modules = ([]);
|
1dd64a | 2000-09-19 | Mattias Wingstedt | |
|
e75fd1 | 2000-07-26 | Johan Sundström | |
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | mapping (RoxenModule:string) otomod = ([]);
|
e75fd1 | 2000-07-26 | Johan Sundström | |
|
b1fca0 | 1996-11-12 | Per Hedbor | |
private array (function) url_module_cache, last_module_cache;
private array (function) logger_module_cache, first_module_cache;
private array (function) filter_module_cache;
private array (array (string|function)) location_module_cache;
private mapping (string:array (function)) file_extension_module_cache=([]);
|
e351dd | 1999-11-29 | Per Hedbor | | private mapping (string:array (RoxenModule)) provider_module_cache=([]);
|
3342dd | 2001-01-19 | Per Hedbor | | private array (RoxenModule) auth_module_cache, userdb_module_cache;
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
38dca8 | 1996-12-10 | Per Hedbor | |
|
0e1557 | 2001-02-23 | Martin Stjernholm | | void unregister_urls()
|
38dca8 | 1996-12-10 | Per Hedbor | | {
|
e62d48 | 2000-02-29 | David Hedbor | | foreach( registered_urls, string url )
|
ecd9ab | 2000-08-23 | Per Hedbor | | roxen.unregister_url(url);
|
dffa22 | 2000-12-10 | Per Hedbor | | registered_urls = ({});
|
38dca8 | 1996-12-10 | Per Hedbor | | }
|
0e1557 | 2001-02-23 | Martin Stjernholm | | private int num_modules = 0;
#ifdef THREADS
private Thread.Condition modules_stopped = Thread.Condition();
#endif
private void safe_stop_module (RoxenModule mod, string desc)
{
if (mixed err = catch (mod && mod->stop && mod->stop()))
report_error ("While stopping " + desc + ": " + describe_backtrace (err));
|
a5249e | 2001-03-05 | Per Hedbor | | if (!--num_modules)
#ifdef THREADS
modules_stopped->signal()
#endif
;
|
0e1557 | 2001-02-23 | Martin Stjernholm | | }
void stop (void|int asynch)
{
unregister_urls();
multiset allmods = mkmultiset (indices (otomod));
num_modules = 17;
if (types_module) {
num_modules++;
roxen.handle (safe_stop_module, types_module, "type module");
allmods[types_module] = 0;
}
if (dir_module) {
num_modules++;
roxen.handle (safe_stop_module, dir_module, "directory module");
allmods[dir_module] = 0;
}
for(int i=0; i<10; i++)
if (Priority p = pri[i]) {
#define STOP_MODULES(MODS, DESC) \
foreach(MODS, RoxenModule m) \
if (allmods[m]) { \
num_modules++; \
roxen.handle (safe_stop_module, m, DESC); \
allmods[m] = 0; \
}
STOP_MODULES (p->url_modules, "url module");
STOP_MODULES (p->logger_modules, "logging module");
STOP_MODULES (p->filter_modules, "filter module");
STOP_MODULES (p->location_modules, "location module");
STOP_MODULES (p->last_modules, "last module");
STOP_MODULES (p->first_modules, "first module");
STOP_MODULES (indices (p->provider_modules), "provider module");
}
if (mixed err = catch {
if (object m = log_function && function_object (log_function)) {
destruct (m);
allmods[m] = 0;
}
}) report_error ("While stopping the logger: " + describe_backtrace (err));
STOP_MODULES(indices (allmods), "unclassified module");
#undef STOP_MODULES
if (!asynch) {
num_modules -= 17;
if (num_modules) {
#ifdef THREADS
modules_stopped->wait();
#else
error ("num_modules shouldn't be nonzero here when running nonthreaded.\n");
#endif
}
}
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | string type_from_filename( string file, int|void to, string|void myext )
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
|
f28c11 | 2000-03-06 | Martin Nilsson | | array(string)|string tmp;
|
14179b | 1997-01-29 | Per Hedbor | | if(!types_fun)
return to?({ "application/octet-stream", 0 }):"application/octet-stream";
|
dfe036 | 2000-03-19 | Martin Nilsson | | string ext=myext || Roxen.extension(file);
|
41b77c | 1999-07-15 | David Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | if(tmp = types_fun(ext))
{
mixed tmp2,nx;
if(tmp[0] == "strip")
{
tmp2=file/".";
if(sizeof(tmp2) > 2)
nx=tmp2[-2];
if(nx && (tmp2=types_fun(nx)))
tmp[0] = tmp2[0];
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | else if(tmp2=types_fun("default"))
tmp[0] = tmp2[0];
|
14179b | 1997-01-29 | Per Hedbor | | else
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | tmp[0]="application/octet-stream";
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | } else if(!(tmp = types_fun("default"))) {
tmp = ({ "application/octet-stream", 0 });
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | return to?tmp:tmp[0];
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
e351dd | 1999-11-29 | Per Hedbor | | array (RoxenModule) get_providers(string provides)
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | {
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | if(!provider_module_cache[provides])
|
10c7e1 | 1999-12-28 | Martin Nilsson | | {
|
ae32d0 | 1998-03-23 | David Hedbor | | int i;
provider_module_cache[provides] = ({ });
for(i = 9; i >= 0; i--)
{
|
10c7e1 | 1999-12-28 | Martin Nilsson | | foreach(indices(pri[i]->provider_modules), RoxenModule d)
if(pri[i]->provider_modules[ d ][ provides ])
|
ae32d0 | 1998-03-23 | David Hedbor | | provider_module_cache[provides] += ({ d });
}
}
return provider_module_cache[provides];
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule get_provider(string provides)
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | {
|
e351dd | 1999-11-29 | Per Hedbor | | array (RoxenModule) prov = get_providers(provides);
|
ae32d0 | 1998-03-23 | David Hedbor | | if(sizeof(prov))
return prov[0];
return 0;
}
|
bdb8da | 1998-09-02 | Johan Schön | | array(mixed) map_providers(string provides, string fun, mixed ... args)
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | {
|
e351dd | 1999-11-29 | Per Hedbor | | array (RoxenModule) prov = get_providers(provides);
|
ae32d0 | 1998-03-23 | David Hedbor | | array error;
|
bdb8da | 1998-09-02 | Johan Schön | | array a=({ });
mixed m;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | foreach(prov, RoxenModule mod)
|
9bb813 | 1998-09-12 | Per Hedbor | | {
|
ae32d0 | 1998-03-23 | David Hedbor | | if(!objectp(mod))
continue;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(functionp(mod[fun]))
|
bdb8da | 1998-09-02 | Johan Schön | | error = catch(m=mod[fun](@args));
|
24fbd4 | 1999-04-21 | David Hedbor | | if(arrayp(error)) {
error[0] = "Error in map_providers(): "+error[0];
|
10c7e1 | 1999-12-28 | Martin Nilsson | | report_debug(describe_backtrace(error));
|
24fbd4 | 1999-04-21 | David Hedbor | | }
|
bdb8da | 1998-09-02 | Johan Schön | | else
|
9bb813 | 1998-09-12 | Per Hedbor | | a += ({ m });
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | | error = 0;
|
ae32d0 | 1998-03-23 | David Hedbor | | }
|
9bb813 | 1998-09-12 | Per Hedbor | | return a;
|
ae32d0 | 1998-03-23 | David Hedbor | | }
mixed call_provider(string provides, string fun, mixed ... args)
|
2f1e89 | 2000-08-15 | Martin Nilsson | |
|
ae32d0 | 1998-03-23 | David Hedbor | | {
|
10c7e1 | 1999-12-28 | Martin Nilsson | | foreach(get_providers(provides), RoxenModule mod)
|
e351dd | 1999-11-29 | Per Hedbor | | {
|
d8b772 | 1998-05-28 | Henrik Grubbström (Grubba) | | function f;
if(objectp(mod) && functionp(f = mod[fun])) {
mixed error;
if (arrayp(error = catch {
mixed ret;
if (ret = f(@args)) {
|
c5e096 | 1999-10-04 | Per Hedbor | | return ret;
|
d8b772 | 1998-05-28 | Henrik Grubbström (Grubba) | | }
})) {
|
24fbd4 | 1999-04-21 | David Hedbor | | error[0] = "Error in call_provider(): "+error[0];
throw(error);
|
d8b772 | 1998-05-28 | Henrik Grubbström (Grubba) | | }
}
|
ae32d0 | 1998-03-23 | David Hedbor | | }
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) file_extension_modules(string ext)
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!file_extension_module_cache[ext])
|
10c7e1 | 1999-12-28 | Martin Nilsson | | {
|
b1fca0 | 1996-11-12 | Per Hedbor | | int i;
file_extension_module_cache[ext] = ({ });
for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d;
RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d = pri[i]->file_extension_modules[ext])
foreach(d, p)
file_extension_module_cache[ext] += ({ p->handle_file_extension });
}
}
return file_extension_module_cache[ext];
}
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) url_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!url_module_cache)
{
int i;
url_module_cache=({ });
for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d;
RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d=pri[i]->url_modules)
foreach(d, p)
url_module_cache += ({ p->remap_url });
}
}
return url_module_cache;
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | static mapping api_module_cache = ([]);
|
e351dd | 1999-11-29 | Per Hedbor | | mapping api_functions(void|RequestID id)
|
4f4bc1 | 1998-02-04 | Per Hedbor | | {
|
fc9d8e | 2000-08-28 | Per Hedbor | | return api_module_cache+([]);
|
4f4bc1 | 1998-02-04 | Per Hedbor | | }
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) logger_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!logger_module_cache)
{
int i;
logger_module_cache=({ });
for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d;
RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d=pri[i]->logger_modules)
foreach(d, p)
if(p->log)
logger_module_cache += ({ p->log });
}
}
return logger_module_cache;
}
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) last_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!last_module_cache)
{
int i;
last_module_cache=({ });
for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d;
RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d=pri[i]->last_modules)
foreach(d, p)
if(p->last_resort)
last_module_cache += ({ p->last_resort });
}
}
return last_module_cache;
}
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | #ifdef __NT__
|
e351dd | 1999-11-29 | Per Hedbor | | static mixed strip_fork_information(RequestID id)
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | {
array a = id->not_query/"::";
id->not_query = a[0];
id->misc->fork_information = a[1..];
|
c5e096 | 1999-10-04 | Per Hedbor | | return 0;
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | }
#endif /* __NT__ */
|
517c7e | 2000-09-30 | Per Hedbor | | array (function) first_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!first_module_cache)
{
int i;
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | first_module_cache=({
#ifdef __NT__
strip_fork_information,
#endif /* __NT__ */
});
|
b1fca0 | 1996-11-12 | Per Hedbor | | for(i=9; i>=0; i--)
{
|
e351dd | 1999-11-29 | Per Hedbor | | array(RoxenModule) d; RoxenModule p;
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | if(d=pri[i]->first_modules) {
foreach(d, p) {
if(p->first_try) {
|
b1fca0 | 1996-11-12 | Per Hedbor | | first_module_cache += ({ p->first_try });
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | }
}
}
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
}
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
|
b1fca0 | 1996-11-12 | Per Hedbor | | return first_module_cache;
}
|
3342dd | 2001-01-19 | Per Hedbor | | array(UserDB) user_databases()
{
if( userdb_module_cache )
return userdb_module_cache;
array tmp = ({});
foreach( values( modules ), mapping m )
foreach( values(m->copies), RoxenModule mo )
if( mo->module_type & MODULE_USERDB )
tmp += ({ ({ mo->query( "_priority" ), mo }) });
sort( tmp );
|
96d86e | 2001-01-29 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | | return userdb_module_cache = reverse(column(tmp,1));
}
array(AuthModule) auth_modules()
{
if( auth_module_cache )
return auth_module_cache;
array tmp = ({});
foreach( values( modules ), mapping m )
foreach( values(m->copies), RoxenModule mo )
if( mo->module_type & MODULE_AUTH )
tmp += ({ ({ mo->query( "_priority" ), mo }) });
sort( tmp );
return auth_module_cache = reverse(column(tmp,1));
}
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | array location_modules()
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd9287 | 2000-08-15 | Johan Sundström | |
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!location_module_cache)
{
int i;
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | array new_location_module_cache=({ });
|
b1fca0 | 1996-11-12 | Per Hedbor | | for(i=9; i>=0; i--)
{
|
10c7e1 | 1999-12-28 | Martin Nilsson | | array(RoxenModule) d;
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule p;
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | if(d=pri[i]->location_modules) {
array level_find_files = ({});
array level_locations = ({});
foreach(d, p) {
string location;
if(p->find_file && (location = p->query_location())) {
level_find_files += ({ p->find_file });
level_locations += ({ location });
}
}
|
dffddc | 2000-10-10 | Johan Sundström | | sort(map(level_locations, sizeof), level_locations, level_find_files);
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | int j;
for (j = sizeof(level_locations); j--;) {
new_location_module_cache += ({ ({ level_locations[j],
level_find_files[j] }) });
}
}
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | location_module_cache = new_location_module_cache;
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
return location_module_cache;
}
|
517c7e | 2000-09-30 | Per Hedbor | | array(function) filter_modules()
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
if(!filter_module_cache)
{
int i;
filter_module_cache=({ });
for(i=9; i>=0; i--)
{
|
10c7e1 | 1999-12-28 | Martin Nilsson | | array(RoxenModule) d;
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule p;
|
b1fca0 | 1996-11-12 | Per Hedbor | | if(d=pri[i]->filter_modules)
foreach(d, p)
if(p->filter)
filter_module_cache+=({ p->filter });
}
}
return filter_module_cache;
}
|
1c7823 | 2000-03-13 | Per Hedbor | | void init_log_file()
{
if(log_function)
{
destruct(function_object(log_function));
log_function = 0;
}
if(query("Log"))
{
string logfile = query("LogFile");
|
f7d981 | 1997-09-12 | Per Hedbor | | if(strlen(logfile))
|
f3ca76 | 2000-08-19 | Per Hedbor | | log_function = roxen.LogFile( logfile )->write;
|
1c7823 | 2000-03-13 | Per Hedbor | | }
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | |
private inline string fix_logging(string s)
|
b1fca0 | 1996-11-12 | Per Hedbor | | {
|
f3ca76 | 2000-08-19 | Per Hedbor | | sscanf(s, "%*[\t ]%s", s);
|
14179b | 1997-01-29 | Per Hedbor | | return s;
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | private void parse_log_formats()
{
string b;
array foo=query("LogFormat")/"\n";
foreach(foo, b)
if(strlen(b) && b[0] != '#' && sizeof(b/":")>1)
|
7a243b | 2000-08-19 | Per Hedbor | | log_format[(int)(b/":")[0]] = fix_logging((b/":")[1..]*":");
|
14179b | 1997-01-29 | Per Hedbor | | }
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | void log(mapping file, RequestID request_id)
|
14179b | 1997-01-29 | Per Hedbor | | {
function f;
|
f3ca76 | 2000-08-19 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(logger_module_cache||logger_modules(), f)
|
f3ca76 | 2000-08-19 | Per Hedbor | | if( f( request_id, file ) )
return;
|
14179b | 1997-01-29 | Per Hedbor | |
|
7a243b | 2000-08-19 | Per Hedbor | | if( !log_function )
|
f3ca76 | 2000-08-19 | Per Hedbor | | return;
|
14179b | 1997-01-29 | Per Hedbor | |
|
7a243b | 2000-08-19 | Per Hedbor | | if(do_not_log_patterns &&
Roxen._match(request_id->remoteaddr, do_not_log_patterns))
|
14179b | 1997-01-29 | Per Hedbor | | return;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
7a243b | 2000-08-19 | Per Hedbor | | string form;
if(!(form=log_format[file->error]))
form = log_format[0];
|
14179b | 1997-01-29 | Per Hedbor | | if(!form) return;
|
7a243b | 2000-08-19 | Per Hedbor | |
roxen.run_log_format( form, log_function, request_id, file );
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | array(string) userinfo(string u, RequestID|void id)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd8192 | 2000-09-19 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3342dd | 2001-01-19 | Per Hedbor | | User uid;
foreach( user_databases(), UserDB m )
if( uid = m->find_user( u ) )
return uid->compat_userinfo();
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | array(string) userlist(RequestID|void id)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd8192 | 2000-09-19 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3342dd | 2001-01-19 | Per Hedbor | | array(string) list = ({});
foreach( user_databases(), UserDB m )
list |= m->list_users();
return list;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | array(string) user_from_uid(int u, RequestID|void id)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd8192 | 2000-09-19 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3342dd | 2001-01-19 | Per Hedbor | | User uid;
foreach( user_databases(), UserDB m )
if( uid = m->find_user_from_uid( u ) )
return uid->compat_userinfo();
|
14179b | 1997-01-29 | Per Hedbor | | }
|
e3f466 | 2001-01-19 | Per Hedbor | | UserDB find_user_database( string name )
|
96d86e | 2001-01-29 | Per Hedbor | |
|
e3f466 | 2001-01-19 | Per Hedbor | | {
foreach( user_databases(), UserDB m )
if( m->name == name )
return m;
}
AuthModule find_auth_module( string name )
|
96d86e | 2001-01-29 | Per Hedbor | |
|
e3f466 | 2001-01-19 | Per Hedbor | | {
foreach( auth_modules(), AuthModule m )
if( m->name == name )
return m;
}
|
3342dd | 2001-01-19 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | | User authenticate( RequestID id, UserDB|void database)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | |
|
0cde96 | 2001-01-21 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | | {
User u;
|
9a4c05 | 2001-01-28 | Per Hedbor | | foreach( auth_modules(), AuthModule method )
if( u = method->authenticate( id, database ) )
return id->misc->authenticated_user = u;
|
3342dd | 2001-01-19 | Per Hedbor | | }
|
96d86e | 2001-01-29 | Per Hedbor | | mapping authenticate_throw( RequestID id, string realm,
UserDB|void database)
|
3342dd | 2001-01-19 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | | {
mapping m;
|
9a4c05 | 2001-01-28 | Per Hedbor | | foreach( auth_modules(), AuthModule method )
if( m = method->authenticate_throw( id, realm, database ) )
return m;
|
96d86e | 2001-01-29 | Per Hedbor | | }
User find_user( string user, RequestID|void id )
{
User uid;
|
d2fcaf | 2001-01-30 | Per Hedbor | | if( id && id->misc->authenticated_user
|
96d86e | 2001-01-29 | Per Hedbor | | && ( uid = id->misc->authenticated_user->database->find_user( user ) ))
return uid;
foreach( user_databases(), UserDB m )
if( uid = m->find_user( user ) )
return uid;
}
|
d2fcaf | 2001-01-30 | Per Hedbor | | array(string) list_users()
{
array(string) list = ({});
foreach( user_databases(), UserDB m )
list |= m->list_users();
return list;
}
array(string) list_groups()
{
array(string) list = ({});
foreach( user_databases(), UserDB m )
list |= m->list_groups();
return list;
}
|
96d86e | 2001-01-29 | Per Hedbor | | Group find_group( string group, RequestID|void id )
{
Group uid;
|
d2fcaf | 2001-01-30 | Per Hedbor | | if( id && id->misc->authenticated_user
|
96d86e | 2001-01-29 | Per Hedbor | | && ( uid = id->misc->authenticated_user->database->find_group( group ) ))
return uid;
foreach( user_databases(), UserDB m )
if( uid = m->find_group( group ) )
return uid;
|
3342dd | 2001-01-19 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | string last_modified_by(Stdio.File file, RequestID id)
|
6103bc | 1999-10-09 | Henrik Grubbström (Grubba) | | {
|
1f4a6c | 2000-08-28 | Per Hedbor | | Stat s;
|
6103bc | 1999-10-09 | Henrik Grubbström (Grubba) | | int uid;
|
9f9fc3 | 2000-02-17 | Per Hedbor | | array u;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
6103bc | 1999-10-09 | Henrik Grubbström (Grubba) | | if(objectp(file)) s=file->stat();
if(!s || sizeof(s)<5) return "A. Nonymous";
uid=s[5];
u=user_from_uid(uid, id);
if(u) return u[0];
return "A. Nonymous";
}
|
14179b | 1997-01-29 | Per Hedbor | |
private mapping internal_gopher_image(string from)
{
sscanf(from, "%s.gif", from);
sscanf(from, "%s.jpg", from);
from -= ".";
|
1c7823 | 2000-03-13 | Per Hedbor | | Stdio.File f = lopen("roxen-images/dir/"+from+".gif","r");
if (f)
|
584884 | 2000-08-28 | Per Hedbor | | return (["file":f, "type":"image/gif", "stat":f->stat(),]);
else
|
06026c | 1999-10-19 | Henrik Grubbström (Grubba) | | return 0;
|
584884 | 2000-08-28 | Per Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | }
private static int nest = 0;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
private mapping misc_cache=([]);
|
3e3bab | 2001-01-19 | Per Hedbor | | int|mapping check_security(function|RoxenModule a, RequestID id,
void|int slevel)
|
14179b | 1997-01-29 | Per Hedbor | | {
array seclevels;
|
12a9c5 | 1997-08-11 | Henrik Grubbström (Grubba) | |
|
193535 | 1997-04-28 | Henrik Grubbström (Grubba) | |
|
bc0fa0 | 2001-03-08 | Per Hedbor | | if(!(seclevels = misc_cache[ a ]))
{
|
3e3bab | 2001-01-19 | Per Hedbor | | RoxenModule mod = Roxen.get_owning_module (a);
|
ab7c31 | 2000-08-12 | Martin Stjernholm | | if(mod && mod->query_seclevels)
|
3b1783 | 1998-11-22 | Per Hedbor | | misc_cache[ a ] = seclevels = ({
|
2b8642 | 2000-06-29 | Martin Stjernholm | | mod->query_seclevels(),
mod->query("_seclvl"),
|
3b1783 | 1998-11-22 | Per Hedbor | | });
else
|
bc0fa0 | 2001-03-08 | Per Hedbor | | misc_cache[ a ] = seclevels = ({0,0});
|
2b8642 | 2000-06-29 | Martin Stjernholm | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
bc0fa0 | 2001-03-08 | Per Hedbor | | if(slevel && (seclevels[1] > slevel))
|
14179b | 1997-01-29 | Per Hedbor | | return 1;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | | mixed err;
|
bc0fa0 | 2001-03-08 | Per Hedbor | | if( function(RequestID:int|mapping) f = seclevels[0] )
err=catch { return f( id ); };
else
return 0;
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | |
|
bc0fa0 | 2001-03-08 | Per Hedbor | | report_error("check_security(): %s:\n%s\n",
LOC_M(39, "Error during module security check"),
describe_backtrace(err));
|
18be21 | 1998-05-07 | Henrik Grubbström (Grubba) | |
|
bc0fa0 | 2001-03-08 | Per Hedbor | | return 1;
|
14179b | 1997-01-29 | Per Hedbor | | }
#endif
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | void invalidate_cache()
|
14179b | 1997-01-29 | Per Hedbor | | {
last_module_cache = 0;
filter_module_cache = 0;
|
3342dd | 2001-01-19 | Per Hedbor | | userdb_module_cache = 0;
auth_module_cache = 0;
|
14179b | 1997-01-29 | Per Hedbor | | first_module_cache = 0;
url_module_cache = 0;
location_module_cache = 0;
logger_module_cache = 0;
file_extension_module_cache = ([]);
|
ae32d0 | 1998-03-23 | David Hedbor | | provider_module_cache = ([]);
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
bc0fa0 | 2001-03-08 | Per Hedbor | | misc_cache = ([ ]);
|
14179b | 1997-01-29 | Per Hedbor | | #endif
}
|
ec058c | 1998-07-04 | Henrik Grubbström (Grubba) | |
void clear_memory_caches()
{
invalidate_cache();
|
10c7e1 | 1999-12-28 | Martin Nilsson | | foreach(indices(otomod), RoxenModule m)
if (m && m->clear_memory_caches)
if (mixed err = catch( m->clear_memory_caches() ))
|
434bac | 2000-07-14 | Andreas Lange | | report_error("clear_memory_caches() "+
|
49cd28 | 2000-08-11 | Andreas Lange | | LOC_M(40, "failed for module %O:\n%s\n"),
|
67f60e | 2000-07-09 | Martin Nilsson | | otomod[m], describe_backtrace(err));
|
ec058c | 1998-07-04 | Henrik Grubbström (Grubba) | | }
|
7de44b | 2000-09-13 | Jonas Wallden | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | static array(string) draw_saturation_bar(int hue,int brightness, int where)
|
fc9433 | 1997-10-25 | Per Hedbor | | {
|
e351dd | 1999-11-29 | Per Hedbor | | Image.Image bar=Image.Image(30,256);
|
fc9433 | 1997-10-25 | Per Hedbor | |
for(int i=0;i<128;i++)
{
int j = i*2;
bar->line(0,j,29,j,@hsv_to_rgb(hue,255-j,brightness));
bar->line(0,j+1,29,j+1,@hsv_to_rgb(hue,255-j,brightness));
}
where = 255-where;
bar->line(0,where,29,where, 255,255,255);
|
2a346d | 2000-09-19 | Per Hedbor | | #if constant(Image.JPEG) && constant(Image.JPEG.encode)
|
7de44b | 2000-09-13 | Jonas Wallden | | return ({ Image.JPEG.encode(bar), "image/jpeg" });
|
2a346d | 2000-09-19 | Per Hedbor | | #else
return ({ Image.PNG.encode(bar), "image/png" });
|
7de44b | 2000-09-13 | Jonas Wallden | | #endif
|
fc9433 | 1997-10-25 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
a6ef1f | 2000-03-28 | Johan Sundström | |
|
2a346d | 2000-09-19 | Per Hedbor | | private mapping internal_roxen_image( string from, RequestID id )
|
14179b | 1997-01-29 | Per Hedbor | | {
sscanf(from, "%s.gif", from);
sscanf(from, "%s.jpg", from);
|
2b658c | 2000-02-07 | Per Hedbor | | sscanf(from, "%s.xcf", from);
sscanf(from, "%s.png", from);
|
fc9433 | 1997-10-25 | Per Hedbor | |
|
1c7823 | 2000-03-13 | Per Hedbor | |
|
fc9433 | 1997-10-25 | Per Hedbor | | int hue,bright,w;
|
7de44b | 2000-09-13 | Jonas Wallden | | if(sscanf(from, "%*s:%d,%d,%d", hue, bright,w)==4) {
array bar = draw_saturation_bar(hue, bright, w);
return Roxen.http_string_answer(bar[0], bar[1]);
}
|
fc9433 | 1997-10-25 | Per Hedbor | |
|
2b658c | 2000-02-07 | Per Hedbor | | Stdio.File f;
|
731076 | 2000-09-19 | Per Hedbor | | if( !id->misc->internal_get )
if(f = lopen("roxen-images/"+from+".gif", "r"))
return (["file":f, "type":"image/gif", "stat":f->stat()]);
|
1c7823 | 2000-03-13 | Per Hedbor | | if(f = lopen("roxen-images/"+from+".png", "r"))
|
584884 | 2000-08-28 | Per Hedbor | | return (["file":f, "type":"image/png", "stat":f->stat()]);
|
731076 | 2000-09-19 | Per Hedbor | |
if(f = lopen("roxen-images/"+from+".jpg", "r"))
return (["file":f, "type":"image/jpeg", "stat":f->stat()]);
|
1c7823 | 2000-03-13 | Per Hedbor | | if(f = lopen("roxen-images/"+from+".xcf", "r"))
|
584884 | 2000-08-28 | Per Hedbor | | return (["file":f, "type":"image/x-gimp-image", "stat":f->stat()]);
|
731076 | 2000-09-19 | Per Hedbor | |
if(f = lopen("roxen-images/"+from+".gif", "r"))
return (["file":f, "type":"image/gif", "stat":f->stat()]);
|
2b658c | 2000-02-07 | Per Hedbor | |
return 0;
|
14179b | 1997-01-29 | Per Hedbor | | }
mapping (mixed:function|int) locks = ([]);
#ifdef THREADS
|
e5bad2 | 1998-02-10 | Per Hedbor | |
|
e6aff0 | 1997-05-25 | Henrik Grubbström (Grubba) | |
|
55a89e | 1997-09-14 | Per Hedbor | | mapping locked = ([]), thread_safe = ([]);
|
e351dd | 1999-11-29 | Per Hedbor | | mixed _lock(object|function f)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | function|int l;
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(module_lock);
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | if (functionp(f)) {
f = function_object(f);
}
|
55a89e | 1997-09-14 | Per Hedbor | | if (l = locks[f])
{
if (l != -1)
{
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | |
|
beb1f2 | 1998-05-23 | Mattias Wingstedt | | catch{
|
91d3c3 | 2001-03-12 | Martin Nilsson | |
|
55a89e | 1997-09-14 | Per Hedbor | | locked[f]++;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | key = l();
|
beb1f2 | 1998-05-23 | Mattias Wingstedt | | };
|
55a89e | 1997-09-14 | Per Hedbor | | } else
thread_safe[f]++;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | } else if (f->thread_safe) {
locks[f]=-1;
|
55a89e | 1997-09-14 | Per Hedbor | | thread_safe[f]++;
|
14179b | 1997-01-29 | Per Hedbor | | } else {
|
55a89e | 1997-09-14 | Per Hedbor | | if (!locks[f])
{
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | |
|
e5bad2 | 1998-02-10 | Per Hedbor | | l = Thread.Mutex()->lock;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | if (!locks[f]) {
locks[f]=l;
}
|
14179b | 1997-01-29 | Per Hedbor | | }
|
91d3c3 | 2001-03-12 | Martin Nilsson | |
|
55a89e | 1997-09-14 | Per Hedbor | | locked[f]++;
|
1fab6f | 1997-09-03 | Henrik Grubbström (Grubba) | | key = l();
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(module_lock);
|
14179b | 1997-01-29 | Per Hedbor | | return key;
|
b1fca0 | 1996-11-12 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | #define LOCK(X) key=_lock(X)
|
d7b087 | 1997-08-31 | Per Hedbor | | #define UNLOCK() do{key=0;}while(0)
|
14179b | 1997-01-29 | Per Hedbor | | #else
#define LOCK(X)
|
c95bd5 | 1998-01-30 | Henrik Grubbström (Grubba) | | #define UNLOCK()
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | string examine_return_mapping(mapping m)
{
string res;
if (m->extra_heads)
m->extra_heads=mkmapping(Array.map(indices(m->extra_heads),
lower_case),
values(m->extra_heads));
else
m->extra_heads=([]);
switch (m->error||200)
{
case 302:
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if (m->extra_heads &&
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | (m->extra_heads->location))
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = sprintf("Returned redirect to %s ", m->extra_heads->location);
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = "Returned redirect, but no location header. ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | break;
case 401:
if (m->extra_heads["www-authenticate"])
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = sprintf("Returned authentication failed: %s ",
|
67f60e | 2000-07-09 | Martin Nilsson | | m->extra_heads["www-authenticate"]);
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = "Returned authentication failed. ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | break;
case 200:
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = "Returned ok. ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | break;
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | default:
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res = sprintf("Returned %d. ", m->error);
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | }
if (!zero_type(m->len))
if (m->len<0)
|
434bac | 2000-07-14 | Andreas Lange | | res += "No data ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else
|
434bac | 2000-07-14 | Andreas Lange | | res += sprintf("%d bytes ", m->len);
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else if (stringp(m->data))
|
434bac | 2000-07-14 | Andreas Lange | | res += sprintf("%d bytes ", strlen(m->data));
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | | else if (objectp(m->file))
if (catch {
|
1f4a6c | 2000-08-28 | Per Hedbor | | Stat a=m->file->stat();
|
434bac | 2000-07-14 | Andreas Lange | | res += sprintf("%d bytes ", a[1]-m->file->tell());
|
b46164 | 1998-10-11 | Henrik Grubbström (Grubba) | | })
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | res += "? bytes ";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | |
|
1a89f4 | 2000-08-14 | Martin Stjernholm | | if (m->data) res += "(static)";
|
434bac | 2000-07-14 | Andreas Lange | | else if (m->file) res += "(open file)";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | |
|
dffa22 | 2000-12-10 | Per Hedbor | | if (stringp(m->extra_heads["content-type"]) ||
|
b46164 | 1998-10-11 | Henrik Grubbström (Grubba) | | stringp(m->type)) {
|
dffa22 | 2000-12-10 | Per Hedbor | | res += sprintf(" of %s", m->type||m->extra_heads["content-type"]);
|
b46164 | 1998-10-11 | Henrik Grubbström (Grubba) | | }
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | |
|
67f60e | 2000-07-09 | Martin Nilsson | | res+="<br />";
|
a1334f | 1998-02-20 | Mirar (Pontus Hagland) | |
return res;
}
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
cd9287 | 2000-08-15 | Johan Sundström | | mapping|int(-1..0) low_get_file(RequestID id, int|void no_magic)
|
14179b | 1997-01-29 | Per Hedbor | | {
#ifdef MODULE_LEVEL_SECURITY
int slevel;
#endif
#ifdef THREADS
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Request for %s", id->not_query), 0);
|
14179b | 1997-01-29 | Per Hedbor | |
string file=id->not_query;
string loc;
function funp;
mixed tmp, tmp2;
|
cd9287 | 2000-08-15 | Johan Sundström | | mapping|object(Stdio.File)|int fid;
|
14179b | 1997-01-29 | Per Hedbor | |
if(!no_magic)
{
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(internal_magic);
|
41b77c | 1999-07-15 | David Hedbor | | #ifndef NO_INTERNAL_HACK
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
41b77c | 1999-07-15 | David Hedbor | |
|
fd9302 | 2000-05-05 | Martin Nilsson | | string type;
|
67f60e | 2000-07-09 | Martin Nilsson | | if(sizeof(file) > 17 &&
|
51d4d2 | 2001-01-04 | Martin Nilsson | | #if ROXEN_COMPAT <= 2.1
|
67f60e | 2000-07-09 | Martin Nilsson | | (file[0] == '/') &&
|
cd9287 | 2000-08-15 | Johan Sundström | | sscanf(file, "%*s/internal-%s-%[^/]", type, loc) == 3
|
67f60e | 2000-07-09 | Martin Nilsson | | #else
|
cd9287 | 2000-08-15 | Johan Sundström | | sscanf(file, "/internal-%s-%[^/]", type, loc) == 2
|
67f60e | 2000-07-09 | Martin Nilsson | | #endif
|
cd9287 | 2000-08-15 | Johan Sundström | | ) {
|
41b77c | 1999-07-15 | David Hedbor | | switch(type) {
|
fd9302 | 2000-05-05 | Martin Nilsson | | case "roxen":
|
a7d034 | 2000-11-13 | Martin Nilsson | | TRACE_LEAVE("Magic internal roxen image");
|
5eb283 | 2001-01-03 | Martin Nilsson | | if(loc=="unit" || loc=="pixel-of-destiny")
|
9c1900 | 2001-02-27 | Per Hedbor | | {
TIMER_END(internal_magic);
return (["data":"GIF89a\1\0\1\0\200ÿ\0ÀÀÀ\0\0\0!ù\4\1\0\0\0\0,"
"\0\0\0\0\1\0\1\0\0\1\1""2\0;",
|
a7d034 | 2000-11-13 | Martin Nilsson | | "type":"image/gif" ]);
|
9c1900 | 2001-02-27 | Per Hedbor | | }
|
5eb283 | 2001-01-03 | Martin Nilsson | | if(has_prefix(loc, "pixel-"))
|
9c1900 | 2001-02-27 | Per Hedbor | | {
TIMER_END(internal_magic);
return (["data":sprintf("GIF89a\1\0\1\0\200\0\0\0\0\0%c%c%c,\0\0\0"
"\0\1\0\1\0\0\2\2L\1\0;",
|
5eb283 | 2001-01-03 | Martin Nilsson | | @parse_color(loc[6..])),
"type":"image/gif" ]);
|
9c1900 | 2001-02-27 | Per Hedbor | | }
TIMER_END(internal_magic);
|
2a346d | 2000-09-19 | Per Hedbor | | return internal_roxen_image(loc, id);
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
41b77c | 1999-07-15 | David Hedbor | | case "gopher":
|
a7d034 | 2000-11-13 | Martin Nilsson | | TRACE_LEAVE("Magic internal gopher image");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(internal_magic);
|
14179b | 1997-01-29 | Per Hedbor | | return internal_gopher_image(loc);
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | }
#endif
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
8552d9 | 2001-01-13 | Martin Nilsson | | if(!search(file, query("InternalLoc")))
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Magic internal module location", 0);
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule module;
|
5839c3 | 1999-01-22 | Marcus Comstedt | | string name, rest;
function find_internal;
|
8552d9 | 2001-01-13 | Martin Nilsson | | if(2==sscanf(file[strlen(query("InternalLoc"))..], "%s/%s", name, rest) &&
|
5839c3 | 1999-01-22 | Marcus Comstedt | | (module = find_module(replace(name, "!", "#"))) &&
(find_internal = module->find_internal))
{
#ifdef MODULE_LEVEL_SECURITY
if(tmp2 = check_security(find_internal, id, slevel))
if(intp(tmp2))
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission to access module denied.");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | find_internal = 0;
} else {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Request denied.");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(internal_magic);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return tmp2;
}
#endif
|
41b77c | 1999-07-15 | David Hedbor | | if(find_internal)
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Calling find_internal()...", find_internal);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | LOCK(find_internal);
fid=find_internal( rest, id );
UNLOCK();
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE(sprintf("find_internal has returned %O", fid));
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(fid)
{
if(mappingp(fid))
{
TRACE_LEAVE("");
TRACE_LEAVE(examine_return_mapping(fid));
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(internal_magic);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return fid;
}
else
{
#ifdef MODULE_LEVEL_SECURITY
int oslevel = slevel;
slevel = misc_cache[ find_internal ][1];
id->misc->seclevel = slevel;
#endif
if(objectp(fid))
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned open filedescriptor. "
|
5839c3 | 1999-01-22 | Marcus Comstedt | | #ifdef MODULE_LEVEL_SECURITY
+(slevel != oslevel?
|
434bac | 2000-07-14 | Andreas Lange | | sprintf(" The security level is now %d.", slevel):"")
|
5839c3 | 1999-01-22 | Marcus Comstedt | | #endif
|
67f60e | 2000-07-09 | Martin Nilsson | | );
|
5839c3 | 1999-01-22 | Marcus Comstedt | | else
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned directory indicator."
|
5839c3 | 1999-01-22 | Marcus Comstedt | | #ifdef MODULE_LEVEL_SECURITY
+(oslevel != slevel?
|
434bac | 2000-07-14 | Andreas Lange | | sprintf(" The security level is now %d.", slevel):"")
|
5839c3 | 1999-01-22 | Marcus Comstedt | | #endif
);
}
} else
TRACE_LEAVE("");
} else
TRACE_LEAVE("");
} else
TRACE_LEAVE("");
}
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(internal_magic);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(!fid)
{
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef URL_MODULES
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(url_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(url_module_cache||url_modules(), funp)
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
5839c3 | 1999-01-22 | Marcus Comstedt | | LOCK(funp);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("URL module", funp);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | tmp=funp( id, file );
UNLOCK();
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
if(mappingp(tmp))
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(url_modules);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return tmp;
}
if(objectp( tmp ))
{
array err;
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
5839c3 | 1999-01-22 | Marcus Comstedt | | nest ++;
err = catch {
if( nest < 20 )
tmp = (id->conf || this_object())->low_get_file( tmp, no_magic );
else
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Too deep recursion");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | error("Too deep recursion in roxen::get_file() while mapping "
+file+".\n");
}
};
nest = 0;
if(err) throw(err);
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(url_modules);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return tmp;
}
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(url_modules);
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(location_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_module_cache||location_modules(), tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
5839c3 | 1999-01-22 | Marcus Comstedt | | loc = tmp[0];
|
41b77c | 1999-07-15 | David Hedbor | | if(!search(file, loc))
|
5839c3 | 1999-01-22 | Marcus Comstedt | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
|
df8d71 | 1998-02-27 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(tmp2 = check_security(tmp[1], id, slevel))
if(intp(tmp2))
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission to access module denied.");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | continue;
} else {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Request denied.");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(location_modules);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return tmp2;
}
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Calling find_file()...", 0);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | LOCK(tmp[1]);
fid=tmp[1]( file[ strlen(loc) .. ] + id->extra_extension, id);
UNLOCK();
|
b8b107 | 2000-03-24 | Per Hedbor | | TRACE_LEAVE("");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(fid)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
5839c3 | 1999-01-22 | Marcus Comstedt | | id->virtfile = loc;
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(mappingp(fid))
{
TRACE_LEAVE("");
TRACE_LEAVE(examine_return_mapping(fid));
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(location_modules);
|
5839c3 | 1999-01-22 | Marcus Comstedt | | return fid;
}
else
{
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
5839c3 | 1999-01-22 | Marcus Comstedt | | int oslevel = slevel;
slevel = misc_cache[ tmp[1] ][1];
id->misc->seclevel = slevel;
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
5839c3 | 1999-01-22 | Marcus Comstedt | | if(objectp(fid))
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned open filedescriptor."
|
41d0f9 | 1998-02-20 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
5839c3 | 1999-01-22 | Marcus Comstedt | | +(slevel != oslevel?
|
434bac | 2000-07-14 | Andreas Lange | | sprintf(" The security level is now %d.", slevel):"")
|
41d0f9 | 1998-02-20 | Per Hedbor | | #endif
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
67f60e | 2000-07-09 | Martin Nilsson | | );
|
5839c3 | 1999-01-22 | Marcus Comstedt | | else
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned directory indicator."
|
41d0f9 | 1998-02-20 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
5839c3 | 1999-01-22 | Marcus Comstedt | | +(oslevel != slevel?
|
434bac | 2000-07-14 | Andreas Lange | | sprintf(" The security level is now %d.", slevel):"")
|
41d0f9 | 1998-02-20 | Per Hedbor | | #endif
|
5839c3 | 1999-01-22 | Marcus Comstedt | | );
break;
}
} else
TRACE_LEAVE("");
|
41b77c | 1999-07-15 | David Hedbor | | } else if(strlen(loc)-1==strlen(file) && file+"/" == loc) {
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
5839c3 | 1999-01-22 | Marcus Comstedt | |
|
67f60e | 2000-07-09 | Martin Nilsson | |
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Automatic redirect to location_module.", tmp[1]);
TRACE_LEAVE("Returning data");
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
41b77c | 1999-07-15 | David Hedbor | |
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
dfe036 | 2000-03-19 | Martin Nilsson | | string new_query = Roxen.http_encode_string(id->not_query) + "/" +
|
41b77c | 1999-07-15 | David Hedbor | | (id->query?("?"+id->query):"");
|
fd9302 | 2000-05-05 | Martin Nilsson | | new_query=Roxen.add_pre_state(new_query, id->prestate);
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(location_modules);
|
dfe036 | 2000-03-19 | Martin Nilsson | | return Roxen.http_redirect(new_query, id);
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(location_modules);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | if(fid == -1)
{
|
41d0f9 | 1998-02-20 | Per Hedbor | | if(no_magic)
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("No magic requested. Returning -1.");
|
41d0f9 | 1998-02-20 | Per Hedbor | | return -1;
}
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(directory_module);
|
14179b | 1997-01-29 | Per Hedbor | | if(dir_module)
{
LOCK(dir_module);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Directory module", dir_module);
|
14179b | 1997-01-29 | Per Hedbor | | fid = dir_module->parse_directory(id);
UNLOCK();
}
else
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("No directory module. Returning 'no such file'");
|
14179b | 1997-01-29 | Per Hedbor | | return 0;
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(directory_module);
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(mappingp(fid))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
41d0f9 | 1998-02-20 | Per Hedbor | | return (mapping)fid;
}
|
14179b | 1997-01-29 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(extension_module);
|
41b77c | 1999-07-15 | David Hedbor | | if(objectp(fid) &&
|
517c7e | 2000-09-30 | Per Hedbor | | (tmp = file_extension_modules(loc = Roxen.extension(id->not_query, id))))
{
|
14179b | 1997-01-29 | Per Hedbor | | foreach(tmp, funp)
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Extension module [%s] ", loc), funp);
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
if(tmp=check_security(funp, id, slevel))
if(intp(tmp))
{
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission to access module denied.");
|
14179b | 1997-01-29 | Per Hedbor | | continue;
}
else
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission denied");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(extension_module);
|
14179b | 1997-01-29 | Per Hedbor | | return tmp;
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | #endif
LOCK(funp);
tmp=funp(fid, loc, id);
UNLOCK();
if(tmp)
{
if(!objectp(tmp))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(extension_module);
|
14179b | 1997-01-29 | Per Hedbor | | return tmp;
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
cd9287 | 2000-08-15 | Johan Sundström | | if(fid && tmp != fid)
|
41b77c | 1999-07-15 | David Hedbor | | destruct(fid);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned new open file");
|
14179b | 1997-01-29 | Per Hedbor | | fid = tmp;
break;
|
41d0f9 | 1998-02-20 | Per Hedbor | | } else
TRACE_LEAVE("");
|
14179b | 1997-01-29 | Per Hedbor | | }
|
41b77c | 1999-07-15 | David Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(extension_module);
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | if(objectp(fid))
{
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(content_type_module);
|
41b77c | 1999-07-15 | David Hedbor | | if(stringp(id->extension)) {
|
14179b | 1997-01-29 | Per Hedbor | | id->not_query += id->extension;
|
dfe036 | 2000-03-19 | Martin Nilsson | | loc = Roxen.extension(id->not_query, id);
|
41b77c | 1999-07-15 | David Hedbor | | }
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Content-type mapping module", types_module);
|
41b77c | 1999-07-15 | David Hedbor | | tmp=type_from_filename(id->not_query, 1, loc);
|
3d9458 | 2000-07-31 | Martin Nilsson | | TRACE_LEAVE(tmp?sprintf("Returned type %s %s.", tmp[0], tmp[1]||"")
|
434bac | 2000-07-14 | Andreas Lange | | : "Missing type.");
|
14179b | 1997-01-29 | Per Hedbor | | if(tmp)
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
TRACE_LEAVE("");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(content_type_module);
|
14179b | 1997-01-29 | Per Hedbor | | return ([ "file":fid, "type":tmp[0], "encoding":tmp[1] ]);
|
10c7e1 | 1999-12-28 | Martin Nilsson | | }
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(content_type_module);
|
14179b | 1997-01-29 | Per Hedbor | | return ([ "file":fid, ]);
}
|
9c1900 | 2001-02-27 | Per Hedbor | |
|
41d0f9 | 1998-02-20 | Per Hedbor | | if(!fid)
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned 'no such file'.");
|
41d0f9 | 1998-02-20 | Per Hedbor | | else
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
14179b | 1997-01-29 | Per Hedbor | | return fid;
}
|
e351dd | 1999-11-29 | Per Hedbor | | mixed handle_request( RequestID id )
|
c7a5f0 | 1999-02-16 | Per Hedbor | | {
function funp;
mixed file;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | REQUEST_WERR("handle_request()");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(handle_request);
TIMER_START(first_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(first_module_cache||first_modules(), funp)
|
c7a5f0 | 1999-02-16 | Per Hedbor | | {
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(file = funp( id ))
|
c7a5f0 | 1999-02-16 | Per Hedbor | | break;
|
cfda38 | 1999-03-28 | Henrik Grubbström (Grubba) | | if(id->conf != this_object()) {
|
10c7e1 | 1999-12-28 | Martin Nilsson | | REQUEST_WERR("handle_request(): Redirected (2)");
|
c7a5f0 | 1999-02-16 | Per Hedbor | | return id->conf->handle_request(id);
|
cfda38 | 1999-03-28 | Henrik Grubbström (Grubba) | | }
|
c7a5f0 | 1999-02-16 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(first_modules);
|
fd8b15 | 1999-05-19 | David Hedbor | | if(!mappingp(file) && !mappingp(file = get_file(id)))
|
c7a5f0 | 1999-02-16 | Per Hedbor | | {
mixed ret;
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(last_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(last_module_cache||last_modules(), funp) if(ret = funp(id)) break;
|
cfda38 | 1999-03-28 | Henrik Grubbström (Grubba) | | if (ret == 1) {
|
10c7e1 | 1999-12-28 | Martin Nilsson | | REQUEST_WERR("handle_request(): Recurse");
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(last_modules);
TIMER_END(handle_request);
|
c7a5f0 | 1999-02-16 | Per Hedbor | | return handle_request(id);
|
cfda38 | 1999-03-28 | Henrik Grubbström (Grubba) | | }
|
c7a5f0 | 1999-02-16 | Per Hedbor | | file = ret;
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(last_modules);
|
c7a5f0 | 1999-02-16 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(handle_request);
|
10c7e1 | 1999-12-28 | Martin Nilsson | | REQUEST_WERR("handle_request(): Done");
|
9c1900 | 2001-02-27 | Per Hedbor | | MERGE_TIMERS(roxen);
|
c7a5f0 | 1999-02-16 | Per Hedbor | | return file;
}
|
fd9302 | 2000-05-05 | Martin Nilsson | | mapping get_file(RequestID id, int|void no_magic, int|void internal_get)
|
cd9287 | 2000-08-15 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(get_file);
|
576c11 | 2000-03-07 | Martin Stjernholm | | int orig_internal_get = id->misc->internal_get;
id->misc->internal_get = internal_get;
|
fd9302 | 2000-05-05 | Martin Nilsson | | mapping|int res;
mapping res2;
|
14179b | 1997-01-29 | Per Hedbor | | function tmp;
res = low_get_file(id, no_magic);
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(get_file);
|
fd9302 | 2000-05-05 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_START(filter_modules);
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(filter_module_cache||filter_modules(), tmp)
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Filter module", tmp);
|
14179b | 1997-01-29 | Per Hedbor | | if(res2=tmp(res,id))
{
if(res && res->file && (res2->file != res->file))
destruct(res->file);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Rewrote result.");
|
14179b | 1997-01-29 | Per Hedbor | | res=res2;
|
41d0f9 | 1998-02-20 | Per Hedbor | | } else
TRACE_LEAVE("");
}
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(filter_modules);
|
576c11 | 2000-03-07 | Martin Stjernholm | |
id->misc->internal_get = orig_internal_get;
|
14179b | 1997-01-29 | Per Hedbor | | return res;
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | array(string) find_dir(string file, RequestID id, void|int(0..1) verbose)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
fd9302 | 2000-05-05 | Martin Nilsson | | array dir;
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("List directory %O.", file), 0);
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
db43d1 | 2000-11-24 | Martin Stjernholm | | if(!sizeof (file) || file[0] != '/')
|
193535 | 1997-04-28 | Henrik Grubbström (Grubba) | | file = "/" + file;
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | #ifdef URL_MODULES
|
fc0e5d | 1997-08-26 | Henrik Grubbström (Grubba) | | #ifdef THREADS
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
fc0e5d | 1997-08-26 | Henrik Grubbström (Grubba) | | #endif
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(url_modules(), function funp)
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | {
string of = id->not_query;
id->not_query = file;
LOCK(funp);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("URL module", funp);
|
3e3bab | 2001-01-19 | Per Hedbor | | mixed remap=funp( id, file );
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | UNLOCK();
|
fd9302 | 2000-05-05 | Martin Nilsson | | if(mappingp( remap ))
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | {
id->not_query=of;
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned 'No thanks'.");
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | return 0;
}
|
fd9302 | 2000-05-05 | Martin Nilsson | | if(objectp( remap ))
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | {
array err;
nest ++;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Recursing");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | file = id->not_query;
err = catch {
if( nest < 20 )
|
fd9302 | 2000-05-05 | Martin Nilsson | | dir = (id->conf || this_object())->find_dir( file, id );
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | else
error("Too deep recursion in roxen::find_dir() while mapping "
+file+".\n");
};
nest = 0;
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | if(err)
throw(err);
|
fd9302 | 2000-05-05 | Martin Nilsson | | return dir;
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | }
id->not_query=of;
}
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | #endif /* URL_MODULES */
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
|
3e3bab | 2001-01-19 | Per Hedbor | | array | mapping d;
|
e927de | 2000-05-06 | Martin Nilsson | | array(string) locks=({});
|
3e3bab | 2001-01-19 | Per Hedbor | | RoxenModule mod;
|
e927de | 2000-05-06 | Martin Nilsson | | string loc;
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), array tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
loc = tmp[0];
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | if(!search(file, loc)) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
|
a78a59 | 1997-04-28 | Henrik Grubbström (Grubba) | | #ifdef MODULE_LEVEL_SECURITY
|
41d0f9 | 1998-02-20 | Per Hedbor | | if(check_security(tmp[1], id)) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission denied");
|
41d0f9 | 1998-02-20 | Per Hedbor | | continue;
}
|
a78a59 | 1997-04-28 | Henrik Grubbström (Grubba) | | #endif
|
e927de | 2000-05-06 | Martin Nilsson | | mod=function_object(tmp[1]);
if(d=mod->find_dir(file[strlen(loc)..], id))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
29a807 | 1998-08-21 | David Hedbor | | if(mappingp(d))
{
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(d->files) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Got exclusive directory.");
TRACE_LEAVE(sprintf("Returning list of %d files.", sizeof(d->files)));
|
fd9302 | 2000-05-05 | Martin Nilsson | | return d->files;
|
29a807 | 1998-08-21 | David Hedbor | | } else
TRACE_LEAVE("");
} else {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Got files.");
|
e927de | 2000-05-06 | Martin Nilsson | | if(!dir) dir=({ });
|
29a807 | 1998-08-21 | David Hedbor | | dir |= d;
}
|
e927de | 2000-05-06 | Martin Nilsson | | }
else {
if(verbose && mod->list_lock_files)
locks |= mod->list_lock_files();
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
e927de | 2000-05-06 | Martin Nilsson | | }
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | } else if((search(loc, file)==0) && (loc[strlen(file)-1]=='/') &&
(loc[0]==loc[-1]) && (loc[-1]=='/') &&
|
6c67c8 | 1998-02-28 | Johan Schön | | (function_object(tmp[1])->stat_file(".", id))) {
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | |
24fa08 | 1998-02-28 | Henrik Grubbström (Grubba) | | * and stat_file(".") returns non-zero.
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | */
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | loc=loc[strlen(file)..];
sscanf(loc, "%s/", loc);
|
df4045 | 2000-06-19 | Henrik Grubbström (Grubba) | | if (dir) {
dir |= ({ loc });
} else {
dir = ({ loc });
}
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Added module mountpoint.");
|
14179b | 1997-01-29 | Per Hedbor | | }
}
|
e927de | 2000-05-06 | Martin Nilsson | | if(!dir) return verbose ? ({0})+locks : ([])[0];
|
14179b | 1997-01-29 | Per Hedbor | | if(sizeof(dir))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE(sprintf("Returning list of %d files.", sizeof(dir)));
|
14179b | 1997-01-29 | Per Hedbor | | return dir;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | }
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning 'No such directory'.");
|
fd9302 | 2000-05-05 | Martin Nilsson | | return 0;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | array(int)|Stat stat_file(string file, RequestID id)
|
14179b | 1997-01-29 | Per Hedbor | | {
string loc;
|
1f4a6c | 2000-08-28 | Per Hedbor | | mixed s, tmp;
|
c5e096 | 1999-10-04 | Per Hedbor | | #ifdef THREADS
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
c5e096 | 1999-10-04 | Per Hedbor | | #endif
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Stat file %O.", file), 0);
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | file=replace(file, "//", "/");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | |
#ifdef URL_MODULES
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(url_modules(), function funp)
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | {
string of = id->not_query;
id->not_query = file;
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("URL module", funp);
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | LOCK(funp);
tmp=funp( id, file );
UNLOCK();
if(mappingp( tmp )) {
id->not_query = of;
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned 'No thanks'.");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | return 0;
}
if(objectp( tmp ))
{
file = id->not_query;
array err;
nest ++;
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Recursing");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | err = catch {
if( nest < 20 )
tmp = (id->conf || this_object())->stat_file( file, id );
else
error("Too deep recursion in roxen::stat_file() while mapping "
+file+".\n");
};
nest = 0;
if(err)
throw(err);
|
8fd51f | 1998-03-01 | Per Hedbor | | TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returning data");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | return tmp;
}
|
8fd51f | 1998-03-01 | Per Hedbor | | TRACE_LEAVE("");
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | id->not_query = of;
}
#endif
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
loc = tmp[0];
if((file == loc) || ((file+"/")==loc))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
TRACE_LEAVE("Exact match.");
|
41d0f9 | 1998-02-20 | Per Hedbor | | TRACE_LEAVE("");
|
223fd1 | 2000-01-27 | Johan Sundström | | return ({ 0775, -3, 0, 0, 0, 0, 0 });
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(!search(file, loc))
|
14179b | 1997-01-29 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), tmp[1]);
|
a78a59 | 1997-04-28 | Henrik Grubbström (Grubba) | | #ifdef MODULE_LEVEL_SECURITY
|
41d0f9 | 1998-02-20 | Per Hedbor | | if(check_security(tmp[1], id)) {
|
8fd51f | 1998-03-01 | Per Hedbor | | TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Permission denied");
|
41d0f9 | 1998-02-20 | Per Hedbor | | continue;
}
|
a78a59 | 1997-04-28 | Henrik Grubbström (Grubba) | | #endif
|
14179b | 1997-01-29 | Per Hedbor | | if(s=function_object(tmp[1])->stat_file(file[strlen(loc)..], id))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Stat ok.");
|
14179b | 1997-01-29 | Per Hedbor | | return s;
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
TRACE_LEAVE("");
|
14179b | 1997-01-29 | Per Hedbor | | }
}
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned 'no such file'.");
|
14179b | 1997-01-29 | Per Hedbor | | }
|
73ce3d | 2000-12-11 | Per Hedbor | | mapping error_file( RequestID id )
{
string data = query("ZNoSuchFile");
NOCACHE();
|
51d4d2 | 2001-01-04 | Martin Nilsson | | #if ROXEN_COMPAT <= 2.1
|
73ce3d | 2000-12-11 | Per Hedbor | | data = replace(data,({"$File", "$Me"}),
|
149344 | 2000-12-17 | Henrik Grubbström (Grubba) | | ({"&page.virtfile;", "&roxen.server;"}));
|
73ce3d | 2000-12-11 | Per Hedbor | | #endif
id->misc->defines = ([ " _error":404 ]);
return Roxen.http_rxml_answer( data, id, 0, "text/html" );
}
|
e8790b | 1998-02-19 | Per Hedbor | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | array open_file(string fname, string mode, RequestID id, void|int internal_get)
|
e8790b | 1998-02-19 | Per Hedbor | | {
|
517c7e | 2000-09-30 | Per Hedbor | | if( id->conf && (id->conf != this_object()) )
return id->conf->open_file( fname, mode, id, internal_get );
|
3e3bab | 2001-01-19 | Per Hedbor | | Configuration oc = id->conf;
|
e8790b | 1998-02-19 | Per Hedbor | | string oq = id->not_query;
function funp;
|
3a4b9a | 1999-12-27 | Martin Nilsson | | mapping|int(0..1) file;
|
cd7ea4 | 1998-12-14 | Peter Bortas | |
id->not_query = fname;
|
c7a5f0 | 1999-02-16 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(first_modules(), funp)
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(file = funp( id ))
|
e8790b | 1998-02-19 | Per Hedbor | | break;
|
517c7e | 2000-09-30 | Per Hedbor | | else if(id->conf && (id->conf != oc))
|
e8790b | 1998-02-19 | Per Hedbor | | {
|
517c7e | 2000-09-30 | Per Hedbor | | return id->conf->open_file(fname, mode,id, internal_get);
|
e8790b | 1998-02-19 | Per Hedbor | | }
fname = id->not_query;
if(search(mode, "R")!=-1)
{
string f;
mode -= "R";
if(f = real_file(fname, id))
|
41d0f9 | 1998-02-20 | Per Hedbor | | {
|
91d3c3 | 2001-03-12 | Martin Nilsson | |
|
e8790b | 1998-02-19 | Per Hedbor | | return ({ open(f, mode), ([]) });
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
238083 | 1998-02-22 | Per Hedbor | |
|
e8790b | 1998-02-19 | Per Hedbor | | }
if(mode=="r")
{
if(!file)
{
|
517c7e | 2000-09-30 | Per Hedbor | | file = get_file( id, 0, internal_get );
|
f920ce | 1998-10-02 | Henrik Grubbström (Grubba) | | if(!file) {
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(last_modules(), funp) if(file = funp( id ))
|
e8790b | 1998-02-19 | Per Hedbor | | break;
|
f920ce | 1998-10-02 | Henrik Grubbström (Grubba) | | if (file == 1) {
|
484ec9 | 2000-06-23 | Martin Stjernholm | | return open_file(id->not_query, mode, id, internal_get);
|
f920ce | 1998-10-02 | Henrik Grubbström (Grubba) | | }
}
|
e8790b | 1998-02-19 | Per Hedbor | | }
if(!mappingp(file))
{
if(id->misc->error_code)
|
dfe036 | 2000-03-19 | Martin Nilsson | | file = Roxen.http_low_answer(id->misc->error_code, "Failed" );
|
238083 | 1998-02-22 | Per Hedbor | | else if(id->method!="GET"&&id->method != "HEAD"&&id->method!="POST")
|
dfe036 | 2000-03-19 | Martin Nilsson | | file = Roxen.http_low_answer(501, "Not implemented.");
|
73ce3d | 2000-12-11 | Per Hedbor | | else
file = error_file( id );
|
e8790b | 1998-02-19 | Per Hedbor | |
id->not_query = oq;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
e8790b | 1998-02-19 | Per Hedbor | | return ({ 0, file });
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if( file->data )
|
e8790b | 1998-02-19 | Per Hedbor | | {
file->file = StringFile(file->data);
m_delete(file, "data");
|
10c7e1 | 1999-12-28 | Martin Nilsson | | }
|
e8790b | 1998-02-19 | Per Hedbor | | id->not_query = oq;
return ({ file->file, file });
}
id->not_query = oq;
|
23414a | 2000-07-21 | Andreas Lange | | return ({ 0, (["error":501, "data":"Not implemented." ]) });
|
e8790b | 1998-02-19 | Per Hedbor | | }
|
9a8a15 | 2000-09-25 | Per Hedbor | | mapping(string:array(mixed)) find_dir_stat(string file, RequestID id)
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | {
string loc;
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | mapping(string:array(mixed)) dir = ([]);
mixed d, tmp;
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | |
|
c7a5f0 | 1999-02-16 | Per Hedbor | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | file=replace(file, "//", "/");
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
db43d1 | 2000-11-24 | Martin Stjernholm | | if(!sizeof (file) || file[0] != '/')
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | file = "/" + file;
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | |
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Request for directory and stat's \"%s\".", file), 0);
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | #ifdef URL_MODULES
#ifdef THREADS
|
3e3bab | 2001-01-19 | Per Hedbor | | Thread.MutexKey key;
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | #endif
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(url_modules(), function funp)
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | {
string of = id->not_query;
id->not_query = file;
LOCK(funp);
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("URL module", funp);
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | tmp=funp( id, file );
UNLOCK();
if(mappingp( tmp ))
{
id->not_query=of;
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | #ifdef MODULE_DEBUG
|
91d3c3 | 2001-03-12 | Martin Nilsson | | report_debug("conf->find_dir_stat(\"%s\"): url_module returned mapping:%O\n",
file, tmp);
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | #endif /* MODULE_DEBUG */
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned mapping."+sprintf("%O", tmp));
|
07014c | 1999-05-24 | Per Hedbor | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | return 0;
}
if(objectp( tmp ))
{
array err;
nest ++;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | file = id->not_query;
err = catch {
if( nest < 20 )
tmp = (id->conf || this_object())->find_dir_stat( file, id );
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | else {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Too deep recursion");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | error("Too deep recursion in roxen::find_dir_stat() while mapping "
+file+".\n");
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | }
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | };
nest = 0;
if(err)
throw(err);
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | #ifdef MODULE_DEBUG
|
91d3c3 | 2001-03-12 | Martin Nilsson | | report_debug("conf->find_dir_stat(\"%s\"): url_module returned object:\n",
file);
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | #endif /* MODULE_DEBUG */
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_LEAVE("Returned object.");
TRACE_LEAVE("Returning it.");
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | return tmp;
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
id->not_query=of;
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
#endif /* URL_MODULES */
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), tmp)
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | {
loc = tmp[0];
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | |
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("Location module [%s] ", loc), 0);
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | if(!search(file, loc))
{
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | |
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | #ifdef MODULE_LEVEL_SECURITY
if(check_security(tmp[1], id)) continue;
#endif
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule c = function_object(tmp[1]);
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | string f = file[strlen(loc)..];
if (c->find_dir_stat) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Has find_dir_stat().", 0);
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | if (d = c->find_dir_stat(f, id)) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Returned mapping."+sprintf("%O", d), c);
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | dir = d | dir;
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | } else if(d = c->find_dir(f, id)) {
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER("Returned array.", 0);
|
10c7e1 | 1999-12-28 | Martin Nilsson | | dir = mkmapping(d, Array.map(d, lambda(string fn)
|
e351dd | 1999-11-29 | Per Hedbor | | {
return c->stat_file(f + fn, id);
})) | dir;
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | } else if(search(loc, file)==0 && loc[strlen(file)-1]=='/' &&
(loc[0]==loc[-1]) && loc[-1]=='/' &&
|
8935ad | 1998-03-30 | Johan Schön | | (function_object(tmp[1])->stat_file(".", id))) {
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | |
8935ad | 1998-03-30 | Johan Schön | | * and stat_file(".") returns non-zero.
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | */
|
434bac | 2000-07-14 | Andreas Lange | | TRACE_ENTER(sprintf("The file %O is on the path to the mountpoint %O.",
|
67f60e | 2000-07-09 | Martin Nilsson | | file, loc), 0);
|
a47671 | 1997-10-20 | Henrik Grubbström (Grubba) | | loc=loc[strlen(file)..];
sscanf(loc, "%s/", loc);
if (!dir[loc]) {
|
cd9287 | 2000-08-15 | Johan Sundström | | dir[loc] = ({ 0775, -3, 0, 0, 0, 0, 0 });
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
|
ae60b6 | 1998-05-23 | Henrik Grubbström (Grubba) | | TRACE_LEAVE("");
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | }
if(sizeof(dir))
return dir;
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | array access(string file, RequestID id)
|
14179b | 1997-01-29 | Per Hedbor | | {
string loc;
array s, tmp;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | file=replace(file, "//", "/");
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
loc = tmp[0];
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | if((file+"/")==loc) {
#ifdef MODULE_LEVEL_SECURITY
if(check_security(tmp[1], id)) continue;
#endif
if(s=function_object(tmp[1])->access("", id))
return s;
} else if(!search(file, loc)) {
|
14179b | 1997-01-29 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
if(check_security(tmp[1], id)) continue;
#endif
if(s=function_object(tmp[1])->access(file[strlen(loc)..], id))
return s;
}
}
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | return 0;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9a8a15 | 2000-09-25 | Per Hedbor | | string real_file(string file, RequestID id)
|
9fd809 | 2000-08-08 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
string loc;
string s;
array tmp;
file=replace(file, "//", "/");
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | if(!id) error("No id passed to real_file");
|
517c7e | 2000-09-30 | Per Hedbor | | foreach(location_modules(), tmp)
|
14179b | 1997-01-29 | Per Hedbor | | {
loc = tmp[0];
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(!search(file, loc))
|
14179b | 1997-01-29 | Per Hedbor | | {
#ifdef MODULE_LEVEL_SECURITY
if(check_security(tmp[1], id)) continue;
#endif
|
c5e096 | 1999-10-04 | Per Hedbor | | if(s=function_object(tmp[1])->real_file(file[strlen(loc)..], id))
|
14179b | 1997-01-29 | Per Hedbor | | return s;
}
}
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | | int|string try_get_file(string s, RequestID id,
|
646f72 | 2000-03-07 | Martin Stjernholm | | int|void status, int|void nocache,
int|void not_internal)
|
2688e2 | 2000-07-26 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
646f72 | 2000-03-07 | Martin Stjernholm | | string res, q, cache_key;
|
e351dd | 1999-11-29 | Per Hedbor | | RequestID fake_id;
|
14179b | 1997-01-29 | Per Hedbor | | mapping m;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(!objectp(id))
|
14179b | 1997-01-29 | Per Hedbor | | error("No ID passed to 'try_get_file'\n");
|
e351dd | 1999-11-29 | Per Hedbor | |
if ( !id->misc )
id->misc = ([]);
if ( !id->misc->common )
id->misc->common = ([]);
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
e351dd | 1999-11-29 | Per Hedbor | | fake_id = id->clone_me();
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
e351dd | 1999-11-29 | Per Hedbor | | fake_id->misc->common = id->misc->common;
|
484ec9 | 2000-06-23 | Martin Stjernholm | | fake_id->misc->internal_get = !not_internal;
|
e351dd | 1999-11-29 | Per Hedbor | |
|
646da2 | 2000-03-20 | Martin Stjernholm | | s = Roxen.fix_relative (s, id);
|
4e0a53 | 2000-03-20 | Martin Stjernholm | | if (fake_id->scan_for_query)
|
41b479 | 2000-09-01 | Per Hedbor | |
|
4e0a53 | 2000-03-20 | Martin Stjernholm | | s = fake_id->scan_for_query (s);
|
14179b | 1997-01-29 | Per Hedbor | | fake_id->raw_url=s;
fake_id->not_query=s;
|
c927a0 | 2000-03-18 | Martin Stjernholm | | if(!(m = get_file(fake_id,0,!not_internal))) {
|
4cd5e8 | 2000-03-20 | Martin Stjernholm | |
m_delete (fake_id->misc, "path_info");
|
484ec9 | 2000-06-23 | Martin Stjernholm | | array a = open_file( s, "r", fake_id, !not_internal );
|
e1e86d | 2000-03-20 | Martin Stjernholm | | if(a && a[0]) {
m = a[1];
m->file = a[0];
}
else {
destruct (fake_id);
return 0;
}
|
c927a0 | 2000-03-18 | Martin Stjernholm | | }
|
a59fc9 | 2000-08-16 | Per Hedbor | | CACHE( fake_id->misc->cacheable );
|
c927a0 | 2000-03-18 | Martin Stjernholm | | destruct (fake_id);
|
889d03 | 1999-10-04 | Per Hedbor | |
|
3bb38c | 2000-01-20 | Martin Bähr | | if (!mappingp(m) && !objectp(m)) {
report_error("try_get_file(%O, %O, %O, %O): m = %O is not a mapping.\n",
s, id, status, nocache, m);
return 0;
}
|
96d86e | 2001-01-29 | Per Hedbor | |
if (!(< 0,2,3 >)[m->error/100]) return 0;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
3510fb | 1997-11-09 | Henrik Grubbström (Grubba) | | if(status) return 1;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(m->data)
|
a22f6f | 1999-05-12 | Per Hedbor | | res = m->data;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | else
|
a22f6f | 1999-05-12 | Per Hedbor | | res="";
|
14179b | 1997-01-29 | Per Hedbor | | m->data = 0;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
4cb221 | 2000-05-22 | Per Hedbor | | if( objectp(m->file) )
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3a4d7e | 1997-09-03 | Per Hedbor | | res += m->file->read();
|
14179b | 1997-01-29 | Per Hedbor | | destruct(m->file);
m->file = 0;
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
14179b | 1997-01-29 | Per Hedbor | | if(m->raw)
{
res -= "\r";
if(!sscanf(res, "%*s\n\n%s", res))
sscanf(res, "%*s\n%s", res);
}
return res;
}
|
9fd809 | 2000-08-08 | Johan Sundström | | int(0..1) is_file(string virt_path, RequestID id)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
9fd809 | 2000-08-08 | Johan Sundström | | return !!stat_file(virt_path, id);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
03aa49 | 2000-08-23 | Per Hedbor | | array registered_urls = ({}), failed_urls = ({ });
|
7a243b | 2000-08-19 | Per Hedbor | | array do_not_log_patterns = 0;
|
14179b | 1997-01-29 | Per Hedbor | | void start(int num)
{
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
5d6c8d | 2000-09-01 | Per Hedbor | | foreach( (registered_urls-query("URLs"))+failed_urls, string url )
{
registered_urls -= ({ url });
|
03aa49 | 2000-08-23 | Per Hedbor | | roxen.unregister_url( url );
|
5d6c8d | 2000-09-01 | Per Hedbor | | }
|
ecd9ab | 2000-08-23 | Per Hedbor | |
|
03aa49 | 2000-08-23 | Per Hedbor | | failed_urls = ({ });
|
ecd9ab | 2000-08-23 | Per Hedbor | |
|
851483 | 2000-11-27 | Per Hedbor | | int st = gethrtime();
|
5d6c8d | 2000-09-01 | Per Hedbor | | foreach( (query( "URLs" )-registered_urls), string url )
|
ecd9ab | 2000-08-23 | Per Hedbor | | if( roxen.register_url( url, this_object() ) )
registered_urls += ({ url });
|
03aa49 | 2000-08-23 | Per Hedbor | | else
failed_urls += ({ url });
|
5f6dae | 2000-08-13 | Per Hedbor | | if( !datacache )
datacache = DataCache( );
else
datacache->init_from_variables();
|
7a243b | 2000-08-19 | Per Hedbor | |
parse_log_formats();
init_log_file();
do_not_log_patterns = query("NoLog");
if(!sizeof(do_not_log_patterns))
do_not_log_patterns = 0;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
e7e603 | 1999-11-05 | Per Hedbor | | void save_me()
{
save_one( 0 );
}
|
14179b | 1997-01-29 | Per Hedbor | | void save(int|void all)
|
2688e2 | 2000-07-26 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
if(all)
{
|
3f628a | 1999-12-09 | Martin Stjernholm | | store("spider#0", variables, 0, this_object());
|
14179b | 1997-01-29 | Per Hedbor | | start(2);
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
3f628a | 1999-12-09 | Martin Stjernholm | | foreach(indices(modules), string modname)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3f628a | 1999-12-09 | Martin Stjernholm | | foreach(indices(modules[modname]->copies), int i)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3f628a | 1999-12-09 | Martin Stjernholm | | store(modname+"#"+i, modules[modname]->copies[i]->query(), 0, this_object());
|
49e3bc | 2001-03-12 | Anders Johansson | | if (mixed err = catch(modules[modname]->copies[i]->
start(2, this_object())))
report_error("Error calling start in module.\n%s",
describe_backtrace (err));
|
14179b | 1997-01-29 | Per Hedbor | | }
}
|
8cc31b | 1997-10-12 | Henrik Grubbström (Grubba) | | invalidate_cache();
|
14179b | 1997-01-29 | Per Hedbor | | }
|
e351dd | 1999-11-29 | Per Hedbor | | int save_one( RoxenModule o )
|
2688e2 | 2000-07-26 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
mapping mod;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(!o)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
c5e096 | 1999-10-04 | Per Hedbor | | store("spider#0", variables, 0, this_object());
|
14179b | 1997-01-29 | Per Hedbor | | start(2);
return 1;
}
|
2c13a8 | 1999-11-10 | Per Hedbor | | string q = otomod[ o ];
if( !q )
error("Invalid module");
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
2c13a8 | 1999-11-10 | Per Hedbor | | store(q, o->query(), 0, this_object());
invalidate_cache();
|
0d1e43 | 2000-11-02 | Per Hedbor | | mixed error;
if( error = catch( o->start(2, this_object()) ) )
{
if( objectp(error ) )
error = (array)error;
if( sizeof(error)>1 && arrayp( error[1] ) )
{
int i;
for( i = 0; i<sizeof( error[1] ); i++ )
if( error[1][i][2] == save_one )
break;
error[1] = error[1][i+1..];
}
if( o->report_error )
o->report_error( "Call to start failed.\n"+describe_backtrace( error ) );
else
report_error( "Call to start failed.\n"+describe_backtrace( error ));
}
|
2c13a8 | 1999-11-10 | Per Hedbor | | invalidate_cache();
return 1;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
2f7920 | 2000-03-27 | Per Hedbor | | RoxenModule reload_module( string modname )
|
596425 | 1999-11-19 | Per Hedbor | | {
|
e351dd | 1999-11-29 | Per Hedbor | | RoxenModule old_module = find_module( modname );
|
9a8a15 | 2000-09-25 | Per Hedbor | | ModuleInfo mi = roxen.find_module( (modname/"#")[0] );
|
2f7920 | 2000-03-27 | Per Hedbor | | if( !old_module ) return 0;
|
f56958 | 1999-11-23 | Per Hedbor | |
|
b86de8 | 2000-11-13 | Per Hedbor | | master()->clear_compilation_failures();
|
1f5652 | 1999-11-23 | Per Hedbor | |
|
b86de8 | 2000-11-13 | Per Hedbor | | if( !old_module->fake )
{
save_one( old_module );
master()->refresh_inherit( object_program( old_module ) );
master()->refresh( object_program( old_module ), 1 );
}
|
2f7920 | 2000-03-27 | Per Hedbor | |
catch( disable_module( modname, 1 ) );
|
f56958 | 1999-11-23 | Per Hedbor | |
|
2f7920 | 2000-03-27 | Per Hedbor | | RoxenModule nm;
|
bcf566 | 2000-04-05 | Per Hedbor | | if( catch( nm = enable_module( modname, 0, 0, 1 ) ) || (nm == 0) )
enable_module( modname, (nm=old_module), mi, 1 );
|
ee3ff0 | 2000-04-06 | Per Hedbor | | else
{
|
2e597a | 2000-04-06 | Martin Stjernholm | | foreach ((array) old_module->error_log, [string msg, array(int) times])
nm->error_log[msg] += times;
|
ee3ff0 | 2000-04-06 | Per Hedbor | |
|
b86de8 | 2000-11-13 | Per Hedbor | | ModuleInfo mi = roxen.find_module( (modname/"#")[0] );
|
ee3ff0 | 2000-04-06 | Per Hedbor | | catch( mi->update_with( nm,0 ) );
|
8148ed | 2000-09-13 | Andreas Lange | | nm->report_notice(LOC_C(11, "Reloaded %s.")+"\n", mi->get_name());
|
1dd64a | 2000-09-19 | Mattias Wingstedt | |
|
ab7c31 | 2000-08-12 | Martin Stjernholm | |
|
637a12 | 2000-09-01 | Martin Stjernholm | |
destruct (old_module);
|
2e597a | 2000-04-06 | Martin Stjernholm | | }
|
bcf566 | 2000-04-05 | Per Hedbor | |
call_start_callbacks( nm, mi, modules[ (modname/"#")[0] ] );
|
f56958 | 1999-11-23 | Per Hedbor | |
|
2f7920 | 2000-03-27 | Per Hedbor | | return nm;
|
596425 | 1999-11-19 | Per Hedbor | | }
|
beba57 | 2000-03-20 | Martin Stjernholm | | #ifdef THREADS
Thread.Mutex enable_modules_mutex = Thread.Mutex();
#define MODULE_LOCK \
Thread.MutexKey enable_modules_lock = enable_modules_mutex->lock (2)
#else
#define MODULE_LOCK
#endif
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | static int enable_module_batch_msgs;
|
2f7920 | 2000-03-27 | Per Hedbor | | RoxenModule enable_module( string modname, RoxenModule|void me,
|
bcf566 | 2000-04-05 | Per Hedbor | | ModuleInfo|void moduleinfo,
int|void nostart )
|
14179b | 1997-01-29 | Per Hedbor | | {
|
beba57 | 2000-03-20 | Martin Stjernholm | | MODULE_LOCK;
|
c5e096 | 1999-10-04 | Per Hedbor | | int id;
|
e351dd | 1999-11-29 | Per Hedbor | | ModuleCopies module;
|
c5e096 | 1999-10-04 | Per Hedbor | | int pr;
mixed err;
int module_type;
|
8b16fe | 2000-09-05 | Per Hedbor | |
|
4867e9 | 2000-09-05 | Per Hedbor | | if( datacache ) datacache->flush();
|
8b16fe | 2000-09-05 | Per Hedbor | |
|
e7e603 | 1999-11-05 | Per Hedbor | | if( sscanf(modname, "%s#%d", modname, id ) != 2 )
|
2f7920 | 2000-03-27 | Per Hedbor | | while( modules[ modname ] && modules[ modname ][ id ] )
|
4f43eb | 1999-11-05 | Per Hedbor | | id++;
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
7f0008 | 1998-03-20 | Per Hedbor | | int start_time = gethrtime();
|
25171c | 1999-11-06 | Per Hedbor | |
|
2f7920 | 2000-03-27 | Per Hedbor | | if( !moduleinfo )
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | {
|
9a8a15 | 2000-09-25 | Per Hedbor | | moduleinfo = roxen.find_module( modname );
|
2f7920 | 2000-03-27 | Per Hedbor | |
if (!moduleinfo)
{
report_warning("Failed to load %s. The module probably "
"doesn't exist in the module path.\n", modname);
|
8b700e | 2000-09-19 | Martin Stjernholm | | got_no_delayed_load = -1;
|
2f7920 | 2000-03-27 | Per Hedbor | | return 0;
}
|
c5e096 | 1999-10-04 | Per Hedbor | | }
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | string descr = moduleinfo->get_name() + (id ? " copy " + (id + 1) : "");
|
3bbda8 | 1997-06-11 | Henrik Grubbström (Grubba) | | #ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs)
report_debug(" %-43s... \b", descr );
|
c5e096 | 1999-10-04 | Per Hedbor | | else
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | report_debug("Enabling " + descr + "\n");
|
3bbda8 | 1997-06-11 | Henrik Grubbström (Grubba) | | #endif
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
0b7d2b | 1999-12-22 | Per Hedbor | | module = modules[ modname ];
|
c5e096 | 1999-10-04 | Per Hedbor | |
if(!module)
|
7e446c | 1999-11-24 | Per Hedbor | | modules[ modname ] = module = ModuleCopies();
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
f56958 | 1999-11-23 | Per Hedbor | | if( !me )
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
f56958 | 1999-11-23 | Per Hedbor | | if(err = catch(me = moduleinfo->instance(this_object())))
{
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs) report_debug("\bERROR\n");
|
67f60e | 2000-07-09 | Martin Nilsson | | if (err != "") {
#endif
string bt=describe_backtrace(err);
|
434bac | 2000-07-14 | Andreas Lange | | report_error("enable_module(): " +
|
49cd28 | 2000-08-11 | Andreas Lange | | LOC_M(41, "Error while initiating module copy of %s%s"),
|
434bac | 2000-07-14 | Andreas Lange | | moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
|
67f60e | 2000-07-09 | Martin Nilsson | | #ifdef MODULE_DEBUG
}
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #endif
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
|
0b7d2b | 1999-12-22 | Per Hedbor | | return module[id];
|
f56958 | 1999-11-23 | Per Hedbor | | }
|
c5e096 | 1999-10-04 | Per Hedbor | | }
|
0b7d2b | 1999-12-22 | Per Hedbor | | if(module[id] && module[id] != me)
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
c45e3f | 2000-02-16 | Per Hedbor | | if( module[id]->stop )
|
0d1e43 | 2000-11-02 | Per Hedbor | | catch( module[id]->stop() );
|
f56958 | 1999-11-23 | Per Hedbor | |
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | me->set_configuration( this_object() );
module_type = moduleinfo->type;
if (module_type & (MODULE_LOCATION|MODULE_EXTENSION|
MODULE_CONFIG|MODULE_FILE_EXTENSION|MODULE_LOGGER|
MODULE_URL|MODULE_LAST|MODULE_PROVIDER|
|
f59076 | 2000-09-10 | Martin Nilsson | | MODULE_FILTER|MODULE_TAG|MODULE_FIRST))
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | {
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type != MODULE_CONFIG)
|
3b1783 | 1998-11-22 | Per Hedbor | | {
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | if (err = catch {
|
23414a | 2000-07-21 | Andreas Lange | | me->defvar("_priority", 5, DLOCALE(12, "Priority"), TYPE_INT_LIST,
DLOCALE(13, "The priority of the module. 9 is highest and 0 is lowest."
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | " Modules with the same priority can be assumed to be "
|
f498ed | 2000-07-11 | Martin Nilsson | | "called in random order"),
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | ({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}));
}) {
throw(err);
}
|
3b1783 | 1998-11-22 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
21306c | 2000-11-02 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
if( (module_type & ~(MODULE_LOGGER|MODULE_PROVIDER)) != 0 )
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | {
|
bc0fa0 | 2001-03-08 | Per Hedbor | |
|
23414a | 2000-07-21 | Andreas Lange | |
me->defvar("_seclevels", "", DLOCALE(16, "Security: Patterns"),
TYPE_TEXT_FIELD,
|
62e2cb | 2001-03-08 | Per Hedbor | | DLOCALE(0,
"The syntax is:\n"
" \n<dl>"
" <dt><b>userdb</b> <i>userdatabase module</i></dt>\n"
" <dd> Select a non-default userdatabase module. The default is to "
" search all modules. The userdatabase module config_userdb is always "
" present, and contains the configuration users</dd>\n"
"<dt><b>authmethod</b> <i>authentication module</i></dt>\n"
"<dd>Select a non-default authentication method.</dd>"
"<dt><b>realm</b> <i>realm name</i></dt>\n"
"<dd>The realm is used when user authentication info is requested</dd>"
"</dl>\n"
" Below, CMD is one of 'allow' and 'deny'\n"
" <dl>\n"
" <dt>CMD <b>ip</b>=<i>ip/bits</i> [return]<br />\n"
" CMD <b>ip</b>=<i>ip:mask</i> [return] <br />\n"
" CMD <b>ip</b>=<i>pattern[,pattern,...]</i> [return] <br /></dt>\n"
" <dd>Match the remote IP-address.</dd>\n"
" \n"
" <dt>CMD <b>user</b>=<i>name[,name,...]</i> [return]</dt>\n"
" <dd>Requires a authenticated user. If the user name 'any' is used, any "
"valid user will be OK. Otherwise, one of the listed users are required.</dd>"
" <dt>CMD <b>group</b>=<i>name[,name,...]</i> [return]</dt>\n"
"<dd>Requires a authenticated user with a group. If the group name "
" 'any' is used, any valid group will be OK. Otherwise, one of the "
"listed groups are required.</dd>\n"
" \n"
"<dt>CMD <b>dns</b>=<i>pattern[,pattern,...]</i> [return]</dt>\n"
"<dd>Require one of the specified DNS domain-names</dd>"
" \n"
"<dt>CMD <b>time</b>=<i>HH:mm-HH:mm</i> [return]</dt>\n"
"<dd>Only allow access to the module from the first time to the "
" second each day. Both times should be specified in 24-hour "
" HH:mm format.</dd>\n"
"<dt>CMD <b>day</b>=<i>day[,day,...]</i> [return]</dt>\n"
"<dd>Only allow access during certain days. Day is either a numerical "
" value (monday=1, sunday=7) or a string (monday, thuesday etc)</dd>"
"</dl><p>\n"
" pattern is always a glob pattern (* = any characters, ? = any character).\n"
"</p><p>\n"
" return means that reaching this command results in immediate\n"
" return, only useful for 'allow'.</p>\n"
" \n"
" <p>'deny' always implies a return, no futher testing is done if a\n"
" 'deny' match.</p>\n"));
|
23414a | 2000-07-21 | Andreas Lange | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(!(module_type & MODULE_PROXY))
|
14179b | 1997-01-29 | Per Hedbor | | {
|
23414a | 2000-07-21 | Andreas Lange | | me->defvar("_seclvl", 0, DLOCALE(18, "Security: Security level"),
TYPE_INT,
|
55a866 | 2000-11-20 | Per Hedbor | | DLOCALE(305, "The modules security level is used to determine if a "
|
3bf345 | 1998-10-01 | Peter Bortas | | " request should be handled by the module."
"\n<p><h2>Security level vs Trust level</h2>"
" Each module has a configurable <i>security level</i>."
" Each request has an assigned trust level. Higher"
" <i>trust levels</i> grants access to modules with higher"
" <i>security levels</i>."
"\n<p><h2>Definitions</h2><ul>"
|
f498ed | 2000-07-11 | Martin Nilsson | | " <li>A requests initial Trust level is infinitely high.</li>"
|
3bf345 | 1998-10-01 | Peter Bortas | | " <li> A request will only be handled by a module if its"
" <i>trust level</i> is higher or equal to the"
|
f498ed | 2000-07-11 | Martin Nilsson | | " <i>security level</i> of the module.</li>"
|
3bf345 | 1998-10-01 | Peter Bortas | | " <li> Each time the request is handled by a module the"
" <i>trust level</i> of the module will be set to the"
" lower of its <i>trust level</i> and the modules"
|
90ecbb | 2000-11-15 | Per Hedbor | | " <i>security level</i>, <i>unless</i> the security "
" level of the module is 0, which is a special "
" case and means that no change should be made.</li>"
|
f498ed | 2000-07-11 | Martin Nilsson | | " </ul></p>"
|
3bf345 | 1998-10-01 | Peter Bortas | | "\n<p><h2>Example</h2>"
" Modules:<ul>"
|
f498ed | 2000-07-11 | Martin Nilsson | | " <li> User filesystem, <i>security level</i> 1</li>"
" <li> Filesystem module, <i>security level</i> 3</li>"
" <li> CGI module, <i>security level</i> 2</li>"
" </ul></p>"
|
3bf345 | 1998-10-01 | Peter Bortas | | "\n<p>A request handled by \"User filesystem\" is assigned"
" a <i>trust level</i> of one after the <i>security"
" level</i> of that module. That request can then not be"
" handled by the \"CGI module\" since that module has a"
" higher <i>security level</i> than the requests trust"
|
f498ed | 2000-07-11 | Martin Nilsson | | " level.</p>"
|
3bf345 | 1998-10-01 | Peter Bortas | | "\n<p>On the other hand, a request handled by the the"
" \"Filsystem module\" could later be handled by the"
|
f498ed | 2000-07-11 | Martin Nilsson | | " \"CGI module\".</p>"));
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | } else {
me->definvisvar("_seclvl", -10, TYPE_INT);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
3bbda8 | 1997-06-11 | Henrik Grubbström (Grubba) | | }
|
21306c | 2000-11-02 | Per Hedbor | | #endif
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | } else {
me->defvar("_priority", 0, "", TYPE_INT, "", 0, 1);
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
a0fbcc | 2000-04-05 | Martin Stjernholm | | mapping(string:mixed) stored_vars = retrieve(modname + "#" + id, this_object());
int has_stored_vars = sizeof (stored_vars);
me->setvars(stored_vars);
|
33e635 | 1998-02-28 | Martin Stjernholm | |
|
0b7d2b | 1999-12-22 | Per Hedbor | | module[ id ] = me;
|
37c1b3 | 1999-10-12 | Per Hedbor | | otomod[ me ] = modname+"#"+id;
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
bcf566 | 2000-04-05 | Per Hedbor | | if(!nostart) call_start_callbacks( me, moduleinfo, module );
#ifdef MODULE_DEBUG
if (enable_module_batch_msgs)
report_debug("\bOK %6.1fms\n", (gethrtime()-start_time)/1000.0);
#endif
|
fd24e2 | 2000-08-28 | Per Hedbor | | if( !enabled_modules[modname+"#"+id] )
{
enabled_modules[modname+"#"+id] = 1;
store( "EnabledModules", enabled_modules, 1, this_object());
}
|
6f595f | 2000-08-20 | Per Hedbor | |
|
bcf566 | 2000-04-05 | Per Hedbor | | if (!has_stored_vars)
store (modname + "#" + id, me->query(), 0, this_object());
|
f63aca | 2000-09-08 | Martin Stjernholm | | if( me->no_delayed_load && got_no_delayed_load >= 0 )
got_no_delayed_load = 1;
|
a8ba69 | 2000-08-29 | Marcus Wellhardh | |
|
bcf566 | 2000-04-05 | Per Hedbor | | return me;
}
void call_start_callbacks( RoxenModule me,
ModuleInfo moduleinfo,
ModuleCopies module )
{
|
40f064 | 2000-09-13 | Per Hedbor | | if(!me) return;
if(!moduleinfo) return;
if(!module) return;
|
a8ba69 | 2000-08-29 | Marcus Wellhardh | | call_low_start_callbacks( me, moduleinfo, module );
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | mixed err;
|
c5e096 | 1999-10-04 | Per Hedbor | | if((me->start) && (err = catch( me->start(0, this_object()) ) ) )
{
#ifdef MODULE_DEBUG
|
bcf566 | 2000-04-05 | Per Hedbor | | if (enable_module_batch_msgs)
report_debug("\bERROR\n");
|
c5e096 | 1999-10-04 | Per Hedbor | | #endif
|
67f60e | 2000-07-09 | Martin Nilsson | | string bt=describe_backtrace(err);
|
49cd28 | 2000-08-11 | Andreas Lange | | report_error(LOC_M(41, "Error while initiating module copy of %s%s"),
|
67f60e | 2000-07-09 | Martin Nilsson | | moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | |
|
bcf566 | 2000-04-05 | Per Hedbor | |
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | }
|
5ffa54 | 2000-02-16 | Per Hedbor | | if( inited && me->ready_to_receive_requests )
|
bcf566 | 2000-04-05 | Per Hedbor | | if( mixed q = catch( me->ready_to_receive_requests( this_object() ) ) )
{
|
c2fdff | 2000-03-21 | Martin Stjernholm | | #ifdef MODULE_DEBUG
if (enable_module_batch_msgs) report_debug("\bERROR\n");
#endif
report_error( "While calling ready_to_receive_requests:\n"+
describe_backtrace( q ) );
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
|
c2fdff | 2000-03-21 | Martin Stjernholm | | }
|
a8ba69 | 2000-08-29 | Marcus Wellhardh | | }
void call_low_start_callbacks( RoxenModule me,
ModuleInfo moduleinfo,
ModuleCopies module )
{
|
40f064 | 2000-09-13 | Per Hedbor | | if(!me) return;
if(!moduleinfo) return;
if(!module) return;
|
a8ba69 | 2000-08-29 | Marcus Wellhardh | | int module_type = moduleinfo->type, pr;
mixed err;
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if (err = catch(pr = me->query("_priority")))
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs) report_debug("\bERROR\n");
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #endif
|
67f60e | 2000-07-09 | Martin Nilsson | | string bt=describe_backtrace(err);
|
49cd28 | 2000-08-11 | Andreas Lange | | report_error(LOC_M(41, "Error while initiating module copy of %s%s"),
|
67f60e | 2000-07-09 | Martin Nilsson | | moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pr = 3;
}
api_module_cache |= me->api_functions();
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(module_type & MODULE_EXTENSION)
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
434bac | 2000-07-14 | Andreas Lange | | report_error("%s is an MODULE_EXTENSION, that type is no "
"longer available.\nPlease notify the modules writer.\n"
"Suitable replacement types include MODULE_FIRST and "
" MODULE_LAST.\n", moduleinfo->get_name());
|
c5e096 | 1999-10-04 | Per Hedbor | | }
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_FILE_EXTENSION)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | if (err = catch {
array arr = me->query_file_extensions();
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if (arrayp(arr))
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | string foo;
foreach( me->query_file_extensions(), foo )
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(pri[pr]->file_extension_modules[foo] )
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->file_extension_modules[foo]+=({me});
else
pri[pr]->file_extension_modules[foo]=({me});
}
|
c45b2a | 1999-12-09 | Martin Stjernholm | | }) {
#ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs) report_debug("\bERROR\n");
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #endif
|
f63aca | 2000-09-08 | Martin Stjernholm | | string bt=describe_backtrace(err);
report_error(LOC_M(41, "Error while initiating module copy of %s%s"),
moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
got_no_delayed_load = -1;
|
c45b2a | 1999-12-09 | Martin Stjernholm | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(module_type & MODULE_PROVIDER)
if (err = catch
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | mixed provs = me->query_provides();
if(stringp(provs))
provs = (< provs >);
if(arrayp(provs))
provs = mkmultiset(provs);
if (multisetp(provs)) {
pri[pr]->provider_modules [ me ] = provs;
|
3bbda8 | 1997-06-11 | Henrik Grubbström (Grubba) | | }
|
c45b2a | 1999-12-09 | Martin Stjernholm | | }) {
#ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs) report_debug("\bERROR\n");
|
c45b2a | 1999-12-09 | Martin Stjernholm | | #endif
|
f63aca | 2000-09-08 | Martin Stjernholm | | string bt=describe_backtrace(err);
report_error(LOC_M(41, "Error while initiating module copy of %s%s"),
moduleinfo->get_name(), (bt ? ":\n"+bt : "\n"));
got_no_delayed_load = -1;
|
c45b2a | 1999-12-09 | Martin Stjernholm | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_TYPES)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | {
types_module = me;
types_fun = me->type_from_extension;
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
f59076 | 2000-09-10 | Martin Nilsson | | if(module_type & MODULE_TAG)
|
c5e096 | 1999-10-04 | Per Hedbor | | add_parse_module( me );
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_DIRECTORIES)
|
aaf391 | 2000-09-19 | Jonas Wallden | | if (me->parse_directory)
dir_module = me;
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_LOCATION)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->location_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_LOGGER)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->logger_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_URL)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->url_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_LAST)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->last_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(module_type & MODULE_FILTER)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->filter_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if(module_type & MODULE_FIRST)
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | pri[pr]->first_modules += ({ me });
|
14179b | 1997-01-29 | Per Hedbor | |
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | invalidate_cache();
|
14179b | 1997-01-29 | Per Hedbor | | }
|
a6ef1f | 2000-03-28 | Johan Sundström | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | string check_variable(string name, mixed value)
|
14179b | 1997-01-29 | Per Hedbor | | {
switch(name)
{
|
cffbaa | 2000-04-11 | Per Hedbor | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | case "throttle":
if (value) {
THROTTLING_DEBUG("configuration: Starting throttler up");
throttler=.throttler();
throttler->throttle(query("throttle_fill_rate"),
query("throttle_bucket_depth"),
query("throttle_min_grant"),
query("throttle_max_grant"));
} else {
|
7e0f38 | 2000-05-06 | Francesco Chemolli | | if (throttler) {
THROTTLING_DEBUG("configuration: Stopping throttler");
destruct(throttler);
throttler=0;
}
|
199d03 | 1999-09-05 | Francesco Chemolli | | }
return 0;
case "throttle_fill_rate":
case "throttle_bucket_depth":
case "throttle_min_grant":
case "throttle_max_grant":
THROTTLING_DEBUG("configuration: setting throttling parameter: "+
name+"="+value);
throttler->throttle(query("throttle_fill_rate"),
query("throttle_bucket_depth"),
query("throttle_min_grant"),
query("throttle_max_grant"));
return 0;
|
14179b | 1997-01-29 | Per Hedbor | | }
}
|
2f4ac1 | 2000-11-02 | Per Hedbor | | void module_changed( ModuleInfo moduleinfo,
RoxenModule me )
|
14179b | 1997-01-29 | Per Hedbor | | {
|
2f4ac1 | 2000-11-02 | Per Hedbor | | clean_up_for_module( moduleinfo, me );
call_low_start_callbacks( me,
moduleinfo,
modules[ moduleinfo->sname ] );
}
|
14179b | 1997-01-29 | Per Hedbor | |
|
2f4ac1 | 2000-11-02 | Per Hedbor | | void clean_up_for_module( ModuleInfo moduleinfo,
RoxenModule me )
{
int pr;
|
c5e096 | 1999-10-04 | Per Hedbor | | if(moduleinfo->type & MODULE_FILE_EXTENSION)
|
14179b | 1997-01-29 | Per Hedbor | | {
string foo;
|
d54d06 | 1999-06-10 | Martin Stjernholm | | for(pr=0; pr<10; pr++)
foreach( indices (pri[pr]->file_extension_modules), foo )
pri[pr]->file_extension_modules[foo]-=({me});
|
14179b | 1997-01-29 | Per Hedbor | | }
|
c5e096 | 1999-10-04 | Per Hedbor | | if(moduleinfo->type & MODULE_PROVIDER) {
|
ae32d0 | 1998-03-23 | David Hedbor | | for(pr=0; pr<10; pr++)
m_delete(pri[pr]->provider_modules, me);
}
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if(moduleinfo->type & MODULE_TYPES)
|
14179b | 1997-01-29 | Per Hedbor | | {
types_module = 0;
types_fun = 0;
}
|
f59076 | 2000-09-10 | Martin Nilsson | | if(moduleinfo->type & MODULE_TAG)
|
b796b5 | 1998-11-18 | Per Hedbor | | remove_parse_module( me );
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_DIRECTORIES )
|
14179b | 1997-01-29 | Per Hedbor | | dir_module = 0;
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_LOCATION )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->location_modules -= ({ me });
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_URL )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->url_modules -= ({ me });
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_LAST )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->last_modules -= ({ me });
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_FILTER )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->filter_modules -= ({ me });
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_FIRST ) {
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->first_modules -= ({ me });
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | }
|
14179b | 1997-01-29 | Per Hedbor | |
|
c5e096 | 1999-10-04 | Per Hedbor | | if( moduleinfo->type & MODULE_LOGGER )
|
14179b | 1997-01-29 | Per Hedbor | | for(pr=0; pr<10; pr++)
pri[pr]->logger_modules -= ({ me });
|
2f4ac1 | 2000-11-02 | Per Hedbor | | }
int disable_module( string modname, int|void nodest )
{
MODULE_LOCK;
RoxenModule me;
int id, pr;
sscanf(modname, "%s#%d", modname, id );
if( datacache ) datacache->flush();
ModuleInfo moduleinfo = roxen.find_module( modname );
mapping module = modules[ modname ];
string descr = moduleinfo->get_name() + (id ? " copy " + (id + 1) : "");
if(!module)
{
report_error("disable_module(): " +
LOC_M(42, "Failed to disable module:\n"
"No module by that name: \"%s\".\n"), modname);
return 0;
}
me = module[id];
m_delete(module->copies, id);
if(!sizeof(module->copies))
m_delete( modules, modname );
invalidate_cache();
if(!me)
{
report_error("disable_module(): " +
LOC_M(43, "Failed to disable module \"%s\".\n"),
descr);
return 0;
}
if(me->stop)
if (mixed err = catch (me->stop())) {
string bt=describe_backtrace(err);
report_error("disable_module(): " +
LOC_M(44, "Error while disabling module %s%s"),
descr, (bt ? ":\n"+bt : "\n"));
}
#ifdef MODULE_DEBUG
report_debug("Disabling "+descr+"\n");
#endif
|
14179b | 1997-01-29 | Per Hedbor | |
|
2f4ac1 | 2000-11-02 | Per Hedbor | | clean_up_for_module( moduleinfo, me );
|
14179b | 1997-01-29 | Per Hedbor | |
|
6f595f | 2000-08-20 | Per Hedbor | | m_delete( enabled_modules, modname + "#" + id );
forcibly_added[ modname + "#" + id ] = 0;
|
5fbaec | 2001-04-11 | Per Hedbor | | if( !nodest )
{
store( "EnabledModules",enabled_modules, 1, this_object());
|
2f7920 | 2000-03-27 | Per Hedbor | | destruct(me);
|
5fbaec | 2001-04-11 | Per Hedbor | | }
|
14179b | 1997-01-29 | Per Hedbor | | return 1;
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | RoxenModule find_module(string name)
|
9fd809 | 2000-08-08 | Johan Sundström | |
|
14179b | 1997-01-29 | Per Hedbor | | {
int id;
sscanf(name, "%s#%d", name, id);
if(modules[name])
|
c5e096 | 1999-10-04 | Per Hedbor | | return modules[name]->copies[id];
|
14179b | 1997-01-29 | Per Hedbor | | return 0;
}
|
f5a274 | 1999-10-18 | Per Hedbor | | multiset forcibly_added = (<>);
int add_modules( array(string) mods, int|void now )
|
14179b | 1997-01-29 | Per Hedbor | | {
|
ba18d7 | 1999-11-27 | Per Hedbor | | #ifdef MODULE_DEBUG
|
c5e096 | 1999-10-04 | Per Hedbor | | int wr;
|
ba18d7 | 1999-11-27 | Per Hedbor | | #endif
|
c5e096 | 1999-10-04 | Per Hedbor | | foreach (mods, string mod)
|
8f061b | 1999-11-19 | Per Hedbor | | {
sscanf( mod, "%s#", mod );
|
10c7e1 | 1999-12-28 | Martin Nilsson | | if( ((now && !modules[ mod ]) ||
|
0ce25d | 1999-11-15 | Per Hedbor | | !enabled_modules[ mod+"#0" ] )
&& !forcibly_added[ mod+"#0" ])
|
14179b | 1997-01-29 | Per Hedbor | | {
|
ba18d7 | 1999-11-27 | Per Hedbor | | #ifdef MODULE_DEBUG
|
c5e096 | 1999-10-04 | Per Hedbor | | if( !wr++ )
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if (enable_module_batch_msgs)
report_debug("\b[ adding req module" + (sizeof (mods) > 1 ? "s" : "") + "\n");
else
report_debug("Adding required module" + (sizeof (mods) > 1 ? "s" : "") + "\n");
|
14179b | 1997-01-29 | Per Hedbor | | #endif
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | forcibly_added[ mod+"#0" ] = 1;
enable_module( mod+"#0" );
|
14179b | 1997-01-29 | Per Hedbor | | }
|
8f061b | 1999-11-19 | Per Hedbor | | }
|
ba18d7 | 1999-11-27 | Per Hedbor | | #ifdef MODULE_DEBUG
|
9a1d47 | 2000-01-12 | Martin Stjernholm | | if( wr && enable_module_batch_msgs )
|
ed8d26 | 1999-12-30 | Martin Stjernholm | | report_debug("] \b");
|
c79b26 | 1998-02-05 | Johan Schön | | #endif
|
14179b | 1997-01-29 | Per Hedbor | | }
|
850c28 | 2001-01-10 | Per Hedbor | | #if ROXEN_COMPAT < 2.2
|
279a0c | 1997-11-26 | Henrik Grubbström (Grubba) | |
|
14179b | 1997-01-29 | Per Hedbor | |
|
279a0c | 1997-11-26 | Henrik Grubbström (Grubba) | | mapping(string:string) sql_urls = ([]);
|
ed9313 | 1998-07-09 | Johan Schön | | mapping sql_cache = ([]);
|
850c28 | 2001-01-10 | Per Hedbor | | Sql.Sql sql_cache_get(string what)
|
ed9313 | 1998-07-09 | Johan Schön | | {
#ifdef THREADS
if(sql_cache[what] && sql_cache[what][this_thread()])
return sql_cache[what][this_thread()];
if(!sql_cache[what])
|
850c28 | 2001-01-10 | Per Hedbor | | sql_cache[what] = ([ this_thread():Sql.Sql( what ) ]);
|
ed9313 | 1998-07-09 | Johan Schön | | else
|
850c28 | 2001-01-10 | Per Hedbor | | sql_cache[what][ this_thread() ] = Sql.Sql( what );
|
ed9313 | 1998-07-09 | Johan Schön | | return sql_cache[what][ this_thread() ];
#else /* !THREADS */
if(!sql_cache[what])
|
850c28 | 2001-01-10 | Per Hedbor | | sql_cache[what] = Sql.Sql( what );
|
ed9313 | 1998-07-09 | Johan Schön | | return sql_cache[what];
#endif
}
|
850c28 | 2001-01-10 | Per Hedbor | | Sql.Sql sql_connect(string db)
|
279a0c | 1997-11-26 | Henrik Grubbström (Grubba) | | {
|
c5e096 | 1999-10-04 | Per Hedbor | | if (sql_urls[db])
return sql_cache_get(sql_urls[db]);
else
return sql_cache_get(db);
|
279a0c | 1997-11-26 | Henrik Grubbström (Grubba) | | }
|
850c28 | 2001-01-10 | Per Hedbor | | #endif
|
14179b | 1997-01-29 | Per Hedbor | |
|
1dd64a | 2000-09-19 | Mattias Wingstedt | |
|
14179b | 1997-01-29 | Per Hedbor | | private string get_my_url()
{
string s;
|
c79b26 | 1998-02-05 | Johan Schön | | #if efun(gethostname)
|
14179b | 1997-01-29 | Per Hedbor | | s = (gethostname()/".")[0] + "." + query("Domain");
s -= "\n";
|
c79b26 | 1998-02-05 | Johan Schön | | #else
s = "localhost";
#endif
|
14179b | 1997-01-29 | Per Hedbor | | return "http://" + s + "/";
}
|
5ffa54 | 2000-02-16 | Per Hedbor | | array after_init_hooks = ({});
mixed add_init_hook( mixed what )
{
if( inited )
call_out( what, 0, this_object() );
else
after_init_hooks |= ({ what });
}
|
d53f0b | 2000-09-09 | Martin Stjernholm | | static int got_no_delayed_load = 0;
|
f63aca | 2000-09-08 | Martin Stjernholm | |
|
d53f0b | 2000-09-09 | Martin Stjernholm | | void fix_no_delayed_load_flag()
|
14179b | 1997-01-29 | Per Hedbor | | {
|
d53f0b | 2000-09-09 | Martin Stjernholm | | if( got_no_delayed_load >= 0 &&
query ("no_delayed_load") != got_no_delayed_load ) {
|
f63aca | 2000-09-08 | Martin Stjernholm | | set( "no_delayed_load", got_no_delayed_load );
|
c45e3f | 2000-02-16 | Per Hedbor | | save_one( 0 );
|
f63aca | 2000-09-08 | Martin Stjernholm | | }
|
5ffa54 | 2000-02-16 | Per Hedbor | | }
|
d53f0b | 2000-09-09 | Martin Stjernholm | | void enable_all_modules()
{
MODULE_LOCK;
low_init( );
fix_no_delayed_load_flag();
}
void low_init(void|int modules_already_enabled)
|
5ffa54 | 2000-02-16 | Per Hedbor | | {
if( inited )
return;
|
8516a7 | 1999-12-22 | Per Hedbor | |
|
24c06c | 2000-02-16 | Per Hedbor | | int start_time = gethrtime();
|
d53f0b | 2000-09-09 | Martin Stjernholm | | if (!modules_already_enabled)
report_debug("\nEnabling all modules for "+query_name()+"... \n");
|
24c06c | 2000-02-16 | Per Hedbor | |
|
1d7d6d | 2000-02-16 | Per Hedbor | | add_parse_module( (object)this_object() );
|
d53f0b | 2000-09-09 | Martin Stjernholm | |
if (!modules_already_enabled) {
enabled_modules = retrieve("EnabledModules", this_object());
|
3e3bab | 2001-01-19 | Per Hedbor | | roxenloader.LowErrorContainer ec = roxenloader.LowErrorContainer();
|
d53f0b | 2000-09-09 | Martin Stjernholm | | roxenloader.push_compile_error_handler( ec );
array modules_to_process = indices( enabled_modules );
string tmp_string;
array err;
forcibly_added = (<>);
enable_module_batch_msgs = 1;
foreach( modules_to_process, tmp_string )
{
if( !forcibly_added[ tmp_string ] )
if(err = catch( enable_module( tmp_string ))) {
report_error(LOC_M(45, "Failed to enable the module %s. Skipping.\n%s"),
tmp_string, describe_backtrace(err));
got_no_delayed_load = -1;
}
}
enable_module_batch_msgs = 0;
roxenloader.pop_compile_error_handler();
if( strlen( ec->get() ) )
report_error( "While enabling modules in "+name+":\n"+ec->get() );
if( strlen( ec->get_warnings() ) )
report_warning( "While enabling modules in "+name+":\n"+ec->get_warnings());
|
f5a274 | 1999-10-18 | Per Hedbor | | }
|
17d6d1 | 2000-03-30 | Per Hedbor | |
|
3e3bab | 2001-01-19 | Per Hedbor | | foreach( ({this_object()})+indices( otomod ), RoxenModule mod )
|
5ffa54 | 2000-02-16 | Per Hedbor | | if( mod->ready_to_receive_requests )
|
f63aca | 2000-09-08 | Martin Stjernholm | | if( mixed q = catch( mod->ready_to_receive_requests( this_object() ) ) ) {
|
c2fdff | 2000-03-21 | Martin Stjernholm | | report_error( "While calling ready_to_receive_requests in "+
|
5ffa54 | 2000-02-16 | Per Hedbor | | otomod[mod]+":\n"+
describe_backtrace( q ) );
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
}
|
5ffa54 | 2000-02-16 | Per Hedbor | |
foreach( after_init_hooks, function q )
|
f63aca | 2000-09-08 | Martin Stjernholm | | if( mixed w = catch( q(this_object()) ) ) {
|
c2fdff | 2000-03-21 | Martin Stjernholm | | report_error( "While calling after_init_hook %O:\n%s",
|
5ffa54 | 2000-02-16 | Per Hedbor | | q, describe_backtrace( w ) );
|
f63aca | 2000-09-08 | Martin Stjernholm | | got_no_delayed_load = -1;
}
|
5ffa54 | 2000-02-16 | Per Hedbor | |
after_init_hooks = ({});
inited = 1;
|
d53f0b | 2000-09-09 | Martin Stjernholm | | if (!modules_already_enabled)
report_notice(LOC_S(4, "All modules for %s enabled in %3.1f seconds") +
"\n\n", query_name(), (gethrtime()-start_time)/1000000.0);
|
0f28da | 1997-08-13 | Per Hedbor | | }
|
5f6dae | 2000-08-13 | Per Hedbor | | DataCache datacache;
|
9a8a15 | 2000-09-25 | Per Hedbor | | static void create(string config)
|
0f28da | 1997-08-13 | Per Hedbor | | {
|
14179b | 1997-01-29 | Per Hedbor | | name=config;
|
851483 | 2000-11-27 | Per Hedbor | |
|
55a866 | 2000-11-20 | Per Hedbor | | roxen.add_permission( "Site:"+config, LOC_C(306,"Site")+": "+config );
|
62e1bb | 2000-11-08 | Per Hedbor | |
|
b0a9ea | 2001-04-18 | Martin Stjernholm | |
|
a3be8e | 2000-10-06 | Martin Stjernholm | | defvar( "data_cache_size", 2048, DLOCALE(274, "Cache:Cache size"),
|
e4e6d3 | 2000-11-02 | Per Hedbor | | TYPE_INT| VAR_PUBLIC,
|
99a745 | 2000-08-22 | Andreas Lange | | DLOCALE(275, "The size of the data cache used to speed up requests "
|
5f6dae | 2000-08-13 | Per Hedbor | | "for commonly requested files, in KBytes"));
|
a3be8e | 2000-10-06 | Martin Stjernholm | | defvar( "data_cache_file_max_size", 50, DLOCALE(276, "Cache:Max file size"),
|
e4e6d3 | 2000-11-02 | Per Hedbor | | TYPE_INT | VAR_PUBLIC,
|
99a745 | 2000-08-22 | Andreas Lange | | DLOCALE(277, "The maximum size of a file that is to be considered for "
|
5f6dae | 2000-08-13 | Per Hedbor | | "the cache"));
|
23414a | 2000-07-21 | Andreas Lange | | defvar("default_server", 0, DLOCALE(20, "Default site"),
|
e4e6d3 | 2000-11-02 | Per Hedbor | | TYPE_FLAG| VAR_PUBLIC,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(21, "If true, this site will be selected in preference of "
|
40e24c | 2000-05-27 | Per Hedbor | | "other sites when virtual hosting is used and no host "
"header is supplied, or the supplied host header does not "
|
f498ed | 2000-07-11 | Martin Nilsson | | "match the address of any of the other servers.") );
|
40e24c | 2000-05-27 | Per Hedbor | |
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | defvar("comment", "", DLOCALE(22, "Site comment"),
|
9b9f70 | 1997-08-12 | Per Hedbor | | TYPE_TEXT_FIELD|VAR_MORE,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(23, "This text will be visible in the administration "
|
434bac | 2000-07-14 | Andreas Lange | | "interface, it can be quite useful to use as a memory helper."));
|
b796b5 | 1998-11-18 | Per Hedbor | |
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | defvar("name", "", DLOCALE(24, "Site name"),
|
e4e6d3 | 2000-11-02 | Per Hedbor | | TYPE_STRING|VAR_MORE| VAR_PUBLIC,
|
8148ed | 2000-09-13 | Andreas Lange | | DLOCALE(25, "This is the name that will be used in the administration "
|
14179b | 1997-01-29 | Per Hedbor | | "interface. If this is left empty, the actual name of the "
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | "site will be used."));
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
b0a9ea | 2001-04-18 | Martin Stjernholm | | defvar("compat_level", Variable.StringChoice (
"", roxen.compat_levels, 0,
DLOCALE(0, "Compatibility level"),
DLOCALE(0, "")));
set ("compat_level", roxen.__roxen_version__);
|
10c7e1 | 1999-12-28 | Martin Nilsson | | defvar("LogFormat",
|
f498ed | 2000-07-11 | Martin Nilsson | | "404: $host $referer - [$cern_date] \"$method $resource $protocol\" 404 -\n"
"500: $host $referer ERROR [$cern_date] \"$method $resource $protocol\" 500 -\n"
"*: $host - - [$cern_date] \"$method $resource $protocol\" $response $length",
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(26, "Logging: Format"),
|
9b9f70 | 1997-08-12 | Per Hedbor | | TYPE_TEXT_FIELD|VAR_MORE,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(27, "What format to use for logging. The syntax is:\n"
|
14179b | 1997-01-29 | Per Hedbor | | "<pre>"
|
434bac | 2000-07-14 | Andreas Lange | | "response-code or *: Log format for that response code\n\n"
|
14179b | 1997-01-29 | Per Hedbor | | "Log format is normal characters, or one or more of the "
"variables below:\n"
"\n"
"\\n \\t \\r -- As in C, newline, tab and linefeed\n"
"$char(int) -- Insert the (1 byte) character specified by the integer.\n"
"$wchar(int) -- Insert the (2 byte) word specified by the integer.\n"
"$int(int) -- Insert the (4 byte) word specified by the integer.\n"
"$^ -- Supress newline at the end of the logentry\n"
"$host -- The remote host name, or ip number.\n"
|
f034ab | 2001-04-17 | Per Hedbor | | "$vhost -- The Host request-header sent by the client, or - if none\n"
|
14179b | 1997-01-29 | Per Hedbor | | "$ip_number -- The remote ip number.\n"
"$bin-ip_number -- The remote host id as a binary integer number.\n"
"\n"
"$cern_date -- Cern Common Log file format date.\n"
|
434bac | 2000-07-14 | Andreas Lange | | "$bin-date -- Time, but as an 32 bit integer in network byteorder\n"
|
14179b | 1997-01-29 | Per Hedbor | | "\n"
"$method -- Request method\n"
"$resource -- Resource identifier\n"
|
dfb4ec | 1999-05-20 | Francesco Chemolli | | "$full_resource -- Full requested resource, including any query fields\n"
|
14179b | 1997-01-29 | Per Hedbor | | "$protocol -- The protocol used (normally HTTP/1.0)\n"
"$response -- The response code sent\n"
"$bin-response -- The response code sent as a binary short number\n"
"$length -- The length of the data section of the reply\n"
|
434bac | 2000-07-14 | Andreas Lange | | "$bin-length -- Same, but as an 32 bit integer in network byteorder\n"
|
0bf5a1 | 1998-04-03 | Henrik Grubbström (Grubba) | | "$request-time -- The time the request took (seconds)\n"
|
14179b | 1997-01-29 | Per Hedbor | | "$referer -- the header 'referer' from the request, or '-'.\n"
|
f498ed | 2000-07-11 | Martin Nilsson | | "$user_agent -- the header 'User-Agent' from the request, or '-'.\n\n"
|
14179b | 1997-01-29 | Per Hedbor | | "$user -- the name of the auth user used, if any\n"
"$user_id -- A unique user ID, if cookies are supported,\n"
" by the client, otherwise '0'\n"
|
f498ed | 2000-07-11 | Martin Nilsson | | "</pre>"), 0, lambda(){ return !query("Log");});
|
b796b5 | 1998-11-18 | Per Hedbor | |
|
23414a | 2000-07-21 | Andreas Lange | | defvar("Log", 1, DLOCALE(28, "Logging: Enabled"),
TYPE_FLAG, DLOCALE(29, "Log requests"));
|
14179b | 1997-01-29 | Per Hedbor | |
|
f498ed | 2000-07-11 | Martin Nilsson | |
defvar("LogFile", "$LOGDIR/"+Roxen.short_name(name)+"/Log",
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(30, "Logging: Log file"), TYPE_FILE,
DLOCALE(31, "The log file. "
|
f7d981 | 1997-09-12 | Per Hedbor | | ""
|
f498ed | 2000-07-11 | Martin Nilsson | | "A file name. Some substitutions will be done:"
|
f7d981 | 1997-09-12 | Per Hedbor | | "<pre>"
|
b796b5 | 1998-11-18 | Per Hedbor | | "%y Year (e.g. '1997')\n"
"%m Month (e.g. '08')\n"
"%d Date (e.g. '10' for the tenth)\n"
|
3bb38c | 2000-01-20 | Martin Bähr | | "%h Hour (e.g. '00')\n"
"%H Hostname\n"
|
f498ed | 2000-07-11 | Martin Nilsson | | "</pre>")
|
c5e096 | 1999-10-04 | Per Hedbor | | ,0, lambda(){ return !query("Log");});
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
defvar("NoLog", ({ }),
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(32, "Logging: No Logging for"), TYPE_STRING_LIST|VAR_MORE,
DLOCALE(33, "Don't log requests from hosts with an IP number which "
|
434bac | 2000-07-14 | Andreas Lange | | "matches any of the patterns in this list. This also affects "
"the access counter log."),
0, lambda(){ return !query("Log");});
|
a8f1b3 | 2000-01-31 | Per Hedbor | |
|
e4e6d3 | 2000-11-02 | Per Hedbor | | defvar("Domain", roxen.get_domain(), DLOCALE(34, "Domain"),
TYPE_STRING|VAR_PUBLIC,
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | DLOCALE(35, "The domain name of the server. The domain name is used "
|
434bac | 2000-07-14 | Andreas Lange | | "to generate default URLs, and to generate email addresses."));
|
14179b | 1997-01-29 | Per Hedbor | |
|
1acaeb | 2000-04-06 | Per Hedbor | | defvar("MyWorldLocation", "http://"+gethostname()+"/",
|
e4e6d3 | 2000-11-02 | Per Hedbor | | DLOCALE(36, "Primary Server URL"), TYPE_URL|VAR_PUBLIC,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(37, "This is the main server URL, where your start page is "
|
434bac | 2000-07-14 | Andreas Lange | | "located. Please note that you also have to configure the "
"'URLs' variable."));
|
c551f2 | 2000-07-04 | Per Hedbor | | defvar("URLs",
Variable.PortList( ({"http://*/"}), VAR_INITIAL,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(38, "URLs"),
DLOCALE(39, "Bind to these URLs. You can use '*' and '?' to perform"
|
434bac | 2000-07-14 | Andreas Lange | | " globbing (using any of these will default to binding to "
"all IP-numbers on your machine). The possible protocols "
"are http, fhttp (a faster version of the normal HTTP "
"protocol, but not 100% compatible with all modules) "
"https, ftp, ftps, gopher and tetris.")));
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | defvar("InternalLoc", "/_internal/",
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(40, "Internal module resource mountpoint"),
|
f406ba | 1999-11-27 | Per Hedbor | | TYPE_LOCATION|VAR_MORE|VAR_DEVELOPER,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(41, "Some modules may want to create links to internal "
|
434bac | 2000-07-14 | Andreas Lange | | "resources. This setting configures an internally handled "
"location that can be used for such purposes. Simply select "
"a location that you are not likely to use for regular "
"resources."));
|
f498ed | 2000-07-11 | Martin Nilsson | |
defvar("throttle", 0,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(42, "Throttling: Server; Enabled"),TYPE_FLAG,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(43, "If set, per-server bandwidth throttling will be enabled. "
|
434bac | 2000-07-14 | Andreas Lange | | "It will allow you to limit the total available bandwidth for "
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | "this site.<br />Bandwidth is assigned using a Token Bucket. "
|
f498ed | 2000-07-11 | Martin Nilsson | | "The principle under which it works is: for each byte we send we use a token. "
"Tokens are added to a repository at a constant rate. When there's not enough, "
"we can't transmit. When there's too many, they \"spill\" and are lost."));
|
199d03 | 1999-09-05 | Francesco Chemolli | |
|
f498ed | 2000-07-11 | Martin Nilsson | | defvar("throttle_fill_rate", 102400,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(44, "Throttling: Server; Average available bandwidth"),
|
199d03 | 1999-09-05 | Francesco Chemolli | | TYPE_INT,
|
1dd64a | 2000-09-19 | Mattias Wingstedt | | DLOCALE(45, "This is the average bandwidth available to this site in "
|
f498ed | 2000-07-11 | Martin Nilsson | | "bytes/sec (the bucket \"fill rate\")."),
0, arent_we_throttling_server);
defvar("throttle_bucket_depth", 1024000,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(46, "Throttling: Server; Bucket Depth"), TYPE_INT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(47, "This is the maximum depth of the bucket. After a long enough period "
|
f498ed | 2000-07-11 | Martin Nilsson | | "of inactivity, a request will get this many unthrottled bytes of data, before "
"throttling kicks back in.<br>Set equal to the Fill Rate in order not to allow "
"any data bursts. This value determines the length of the time over which the "
"bandwidth is averaged."), 0, arent_we_throttling_server);
defvar("throttle_min_grant", 1300,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(48, "Throttling: Server; Minimum Grant"), TYPE_INT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(49, "When the bandwidth availability is below this value, connections will "
|
f498ed | 2000-07-11 | Martin Nilsson | | "be delayed rather than granted minimal amounts of bandwidth. The purpose "
"is to avoid sending too small packets (which would increase the IP overhead)."),
0, arent_we_throttling_server);
defvar("throttle_max_grant", 14900,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(50, "Throttling: Server; Maximum Grant"), TYPE_INT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(51, "This is the maximum number of bytes assigned in a single request "
|
f498ed | 2000-07-11 | Martin Nilsson | | "to a connection. Keeping this number low will share bandwidth more evenly "
"among the pending connections, but keeping it too low will increase IP "
"overhead and (marginally) CPU usage. You'll want to set it just a tiny "
"bit lower than any integer multiple of your network's MTU (typically 1500 "
"for ethernet)."), 0, arent_we_throttling_server);
|
199d03 | 1999-09-05 | Francesco Chemolli | |
defvar("req_throttle", 0,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(52, "Throttling: Request; Enabled"), TYPE_FLAG,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(53, "If set, per-request bandwidth throttling will be enabled.")
|
199d03 | 1999-09-05 | Francesco Chemolli | | );
|
4d1683 | 1999-11-17 | Per Hedbor | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | defvar("req_throttle_min", 1024,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(54, "Throttling: Request; Minimum guarranteed bandwidth"),
|
199d03 | 1999-09-05 | Francesco Chemolli | | TYPE_INT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(55, "The maximum bandwidth each connection (in bytes/sec) can use is determined "
|
f498ed | 2000-07-11 | Martin Nilsson | | "combining a number of modules. But doing so can lead to too small "
"or even negative bandwidths for particularly unlucky requests. This variable "
"guarantees a minimum bandwidth for each request."),
0, arent_we_throttling_request);
|
4d1683 | 1999-11-17 | Per Hedbor | |
|
199d03 | 1999-09-05 | Francesco Chemolli | | defvar("req_throttle_depth_mult", 60.0,
|
101eb5 | 2000-11-16 | Per Hedbor | | DLOCALE(56, "Throttling: Request; Bucket Depth Multiplier"),
|
199d03 | 1999-09-05 | Francesco Chemolli | | TYPE_FLOAT,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(57, "The average bandwidth available for each request will be determined by "
|
f498ed | 2000-07-11 | Martin Nilsson | | "the modules combination. The bucket depth will be determined multiplying "
"the rate by this factor."),
0, arent_we_throttling_request);
|
4d1683 | 1999-11-17 | Per Hedbor | |
|
9fbde2 | 2000-11-06 | Per Hedbor | |
defvar("404-files", ({ "404.inc" }),
|
55a866 | 2000-11-20 | Per Hedbor | | DLOCALE(307, "No such file message override files"),
|
9fbde2 | 2000-11-06 | Per Hedbor | | TYPE_STRING_LIST|VAR_PUBLIC,
|
55a866 | 2000-11-20 | Per Hedbor | | DLOCALE(308,
|
9fbde2 | 2000-11-06 | Per Hedbor | | "If no file match a given resource all directories above the"
" wanted file is searched for one of the files in this list."
"<p>\n"
"As an example, if the file /foo/bar/not_there.html is "
"wanted, and this list contains the default value of 404.inc,"
" these files will be searched for, in this order:</p><br /> "
" /foo/bar/404.inc, /foo/404.inc and /404.inc." ) );
class NoSuchFileOverride
{
inherit Variable.Variable;
int check_visibility( RequestID id, int more_mode,
int expert_mode, int devel_mode,
int initial, int|void variable_in_cfif )
{
return 0;
}
void set( string newval )
{
if( search(newval,"emit source=values") == -1 )
variables[ "404-message" ]->set( newval );
}
void create()
{
::create(
#"<nooutput><emit source=values scope=ef variable='modvar.site.404-files'>
<set variable='var.base' value=''/>
<emit source='path'>
<append variable='var.base' value='/&_.name;'/>
<set variable='var.404' value='&var.base;/&ef.value;'/>
<if exists='&var.404;'>
<set variable='var.errfile' from='var.404'/>
</if>
</emit>
</emit>
</nooutput><if variable='var.errfile'><eval><insert file='&var.errfile;'/></eval></if><else><eval>&modvar.site.404-message:none;</eval></else>", 0, 0, 0 );
}
};
defvar("ZNoSuchFile", NoSuchFileOverride() );
defvar("404-message", #"
|
94d475 | 2000-04-05 | Martin Nilsson | | <html><head>
<title>404 - Page not found</title>
</head>
<body alink=\"#000000\" bgcolor=\"#ffffff\" bottommargin=\"0\" leftmargin=\"0\" link=\"#ce5c00\" marginheight=\"2\" marginwidth=\"0\" rightmargin=\"0\" text=\"#333333\" topmargin=\"2\" vlink=\"#ce5c00\">
|
8cf9d8 | 2000-09-19 | Martin Nilsson | | <if nserious=''><set variable='var.404' value='-sorry' /></if>
|
94d475 | 2000-04-05 | Martin Nilsson | | <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">
<tr>
|
8cf9d8 | 2000-09-19 | Martin Nilsson | | <td><img src=\"/internal-roxen-page-not-found&var.404;\" border=\"0\" alt=\"Page not found\" width=\"404\" hspace=\"2\" /></td>
|
94d475 | 2000-04-05 | Martin Nilsson | | <td> </td>
|
8cf9d8 | 2000-09-19 | Martin Nilsson | | <td align=\"right\"><font face=\"lucida,helvetica,arial\">
|
59a049 | 2000-12-11 | Martin Nilsson | | <b>Roxen WebServer &roxen.base-version; </b></font></td>
|
94d475 | 2000-04-05 | Martin Nilsson | | </tr>
<tr>
<td width=\"100%\" height=\"21\" colspan=\"3\" background=\"/internal-roxen-tile\"><img src=\"/internal-roxen-unit\" alt=\"\" /></td>
</tr>
</table>
<font face=\"lucida,helvetica,arial\">
<h2> Unable to retrieve &page.virtfile;.</h2>
<br /><br />
<blockquote>
If you feel that this is a configuration error,
|
8cf9d8 | 2000-09-19 | Martin Nilsson | | please contact the administrators of this
webserver or the author of the
<if referrer=''>
|
94d475 | 2000-04-05 | Martin Nilsson | | <a href=\"&client.referrer;\">referring</a>
</if><else>
referring
</else>
page.
</blockquote>
</font>
</body>
",
|
9fbde2 | 2000-11-06 | Per Hedbor | | DLOCALE(58, "No such file message"),
TYPE_TEXT_FIELD|VAR_PUBLIC,
|
23414a | 2000-07-21 | Andreas Lange | | DLOCALE(59, "What to return when there is no resource or file "
|
434bac | 2000-07-14 | Andreas Lange | | "available at a certain location."));
|
a7e39f | 2000-02-04 | Per Hedbor | |
|
e4e6d3 | 2000-11-02 | Per Hedbor | | definvisvar( "no_delayed_load", 0, TYPE_FLAG|VAR_PUBLIC );
|
a7e39f | 2000-02-04 | Per Hedbor | |
|
91d3c3 | 2001-03-12 | Martin Nilsson | |
|
851483 | 2000-11-27 | Per Hedbor | |
|
b0a9ea | 2001-04-18 | Martin Stjernholm | |
mapping(string:mixed) retrieved_vars = retrieve("spider#0", this_object());
if (sizeof (retrieved_vars) && !retrieved_vars->compat_level)
set ("compat_level", "2.1");
setvars( retrieved_vars );
|
199d03 | 1999-09-05 | Francesco Chemolli | |
|
91d3c3 | 2001-03-12 | Martin Nilsson | |
|
07c992 | 1999-11-23 | Per Hedbor | | if (query("throttle"))
|
c5e096 | 1999-10-04 | Per Hedbor | | {
|
199d03 | 1999-09-05 | Francesco Chemolli | | throttler=.throttler();
throttler->throttle(query("throttle_fill_rate"),
query("throttle_bucket_depth"),
query("throttle_min_grant"),
query("throttle_max_grant"));
}
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | static int arent_we_throttling_server () {
|
199d03 | 1999-09-05 | Francesco Chemolli | | return !query("throttle");
}
|
9a8a15 | 2000-09-25 | Per Hedbor | | static int arent_we_throttling_request() {
|
199d03 | 1999-09-05 | Francesco Chemolli | | return !query("req_throttle");
|
14179b | 1997-01-29 | Per Hedbor | | }
|