835c6c | 2001-06-17 | Martin Nilsson | |
|
6b67fe | 2001-08-24 | Martin Nilsson | |
|
a0e5a4 | 2003-06-10 | Anders Johansson | | constant cvs_version = "$Id: configuration.pike,v 1.532 2003/06/10 12:22:14 anders 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
|
471705 | 2001-05-07 | Per Hedbor | |
#ifdef AVERAGE_PROFILING
|
7e1610 | 2001-11-01 | Henrik Grubbström (Grubba) | |
#if !constant(gethrvtime)
#define gethrvtime() gethrtime()
#endif /* !constant(gethrvtime) */
|
471705 | 2001-05-07 | Per Hedbor | | class ProfStack
{
array current_stack = ({});
void enter( string k, RequestID id )
{
current_stack += ({ ({ k, gethrtime(), gethrvtime() }) });
}
void leave( string k, RequestID id )
{
int t0 = gethrtime();
int t1 = gethrvtime();
if( !sizeof(current_stack ) )
{
|
7937df | 2001-05-16 | Per Hedbor | |
|
471705 | 2001-05-07 | Per Hedbor | | return;
}
int i = sizeof( current_stack )-1;
while( current_stack[ i ][0] != k && i >= 0 ) i--;
if(i < 0 )
{
return;
}
|
7937df | 2001-05-16 | Per Hedbor | | void low_leave( int i )
{
int tt = t0-current_stack[i][1];
int ttv = t1-current_stack[i][2];
if( i > 0 )
{
current_stack[i-1][1]+=tt+gethrtime()-t0;
current_stack[i-1][2]+=ttv+gethrvtime()-t1;
}
current_stack = current_stack[..i-1];
add_prof_entry( id, k, tt, ttv );
};
|
471705 | 2001-05-07 | Per Hedbor | |
|
7937df | 2001-05-16 | Per Hedbor | | if( i != sizeof( current_stack )-1 )
|
471705 | 2001-05-07 | Per Hedbor | | {
|
7937df | 2001-05-16 | Per Hedbor | | for( int j = sizeof( current_stack )-1; j>=i; j-- )
low_leave( j );
return;
|
471705 | 2001-05-07 | Per Hedbor | | }
|
7937df | 2001-05-16 | Per Hedbor | | low_leave( i );
|
471705 | 2001-05-07 | Per Hedbor | | }
}
class ProfInfo( string url )
{
mapping data = ([]);
void add( string k, int h, int hrv )
{
if( !data[k] )
data[k] = ({ h, hrv, 1 });
else
{
data[k][0]+=h;
data[k][1]+=hrv;
data[k][2]++;
}
}
array summarize_table( )
{
array table = ({});
int n, t, v;
foreach( indices( data ), string k )
table += ({ ({ k,
sprintf( "%d", (n=data[k][2]) ),
sprintf("%5.2f",(t=data[k][0])/1000000.0),
sprintf("%5.2f", (v=data[k][1])/1000000.0),
sprintf("%8.2f", t/n/1000.0),
sprintf("%8.2f",v/n/1000.0), }) });
sort( (array(float))column(table,2), table );
return reverse(table);
}
void dump( )
{
write( "\n"+url+": \n" );
|
ab1e02 | 2002-03-06 | Henrik Grubbström (Grubba) | | ADT.Table.table t = ADT.Table.table( summarize_table(),
({ "What", "Calls",
"Time", "CPU",
"t/call(ms)", "cpu/call(ms)" }));
|
471705 | 2001-05-07 | Per Hedbor | |
write( ADT.Table.ASCII.encode( t )+"\n" );
}
}
mapping profiling_info = ([]);
void debug_write_prof( )
{
foreach( sort( indices( profiling_info ) ), string p )
profiling_info[p]->dump();
}
void add_prof_entry( RequestID id, string k, int hr, int hrv )
{
|
e8dffa | 2001-05-14 | Per Hedbor | | string l = id->not_query;
|
7937df | 2001-05-16 | Per Hedbor | |
if( has_prefix( l, query_internal_location() ) )
l = dirname( l );
if( !profiling_info[l] )
profiling_info[l] = ProfInfo(l);
|
e8dffa | 2001-05-14 | Per Hedbor | | profiling_info[l]->add( k, hr, hrv );
|
471705 | 2001-05-07 | Per Hedbor | | }
void avg_prof_enter( string name, string type, RequestID id )
{
if( !id->misc->prof_stack )
id->misc->prof_stack = ProfStack();
id->misc->prof_stack->enter( name+":"+type,id );
}
void avg_prof_leave( string name, string type, RequestID id )
{
if( !id->misc->prof_stack ) id->misc->prof_stack = ProfStack();
id->misc->prof_stack->leave( name+":"+type,id );
}
#endif
|
b1fca0 | 1996-11-12 | Per Hedbor | |
|
9a8a15 | 2000-09-25 | Per Hedbor | | inherit Configuration;
inherit "basic_defvar";
|
dfe036 | 2000-03-19 | Martin Nilsson | |
|
b9c387 | 2002-03-27 | Per Hedbor | | static mapping(RequestID:mapping) current_connections =
set_weak_flag( ([ ]), 1 );
void connection_add( RequestID id, mapping data )
{
current_connections[id] = data;
}
mapping connection_drop( RequestID id )
{
m_delete( current_connections, id );
}
mapping(RequestID:mapping) connection_get( )
{
return current_connections;
}
|
3557f5 | 2001-06-30 | Martin Stjernholm | |
string name = roxen->bootstrap_info->get();
|
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 )
{
|
c42ab3 | 2002-04-15 | Jonas Wallden | | if( strlen( data ) > max_file_size ) return;
|
d09399 | 2000-09-25 | Per Hedbor | | 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 | | {
|
9ac033 | 2002-11-05 | Anders Johansson | | return internal_location+(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 | | }
|
b6675b | 2002-10-28 | Martin Stjernholm | | private float cached_compat_level;
float compat_level()
{
if (cached_compat_level == 0.0)
cached_compat_level = (float) query ("compat_level");
return cached_compat_level;
}
|
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 | | }
|
9ac033 | 2002-11-05 | Anders Johansson | |
private int sub_req_limit = 30;
private string internal_location = "/_internal/";
|
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 | | {
|
9c3c6c | 2001-11-09 | Henrik Grubbström (Grubba) | | foreach( registered_urls + failed_urls, string url )
roxen.unregister_url(url, this_object());
|
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();
|
7660ad | 2002-10-23 | Martin Stjernholm | | private Thread.Mutex modules_stopped_mutex = Thread.Mutex();
|
0e1557 | 2001-02-23 | Martin Stjernholm | | #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 | | #ifdef THREADS
|
7660ad | 2002-10-23 | Martin Stjernholm | | Thread.MutexKey lock = modules_stopped_mutex->lock();
if (!--num_modules)
modules_stopped->signal();
lock = 0;
#else
--num_modules;
|
a5249e | 2001-03-05 | Per Hedbor | | #endif
|
0e1557 | 2001-02-23 | Martin Stjernholm | | }
void stop (void|int asynch)
{
|
79b7c3 | 2001-09-13 | Honza Petrous | |
#ifdef SNMP_AGENT
if(query("snmp_process") && objectp(roxen->snmpagent)) {
roxen->snmpagent->vs_stop_trap(get_config_id());
roxen->snmpagent->del_virtserv(get_config_id());
}
#endif
|
0e1557 | 2001-02-23 | Martin Stjernholm | | 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) {
#ifdef THREADS
|
7660ad | 2002-10-23 | Martin Stjernholm | | Thread.MutexKey lock = modules_stopped_mutex->lock();
num_modules -= 17;
if (num_modules) modules_stopped->wait (lock);
lock = 0;
|
0e1557 | 2001-02-23 | Martin Stjernholm | | #else
|
7660ad | 2002-10-23 | Martin Stjernholm | | if (num_modules != 17)
|
0e1557 | 2001-02-23 | Martin Stjernholm | | 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";
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | | string ext = lower_case(myext || Roxen.extension(file));
|
41b77c | 1999-07-15 | David Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | if(tmp = types_fun(ext))
{
mixed tmp2,nx;
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | |
if (tmp[0] == "strip")
|
14179b | 1997-01-29 | Per Hedbor | | {
tmp2=file/".";
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | | if (sizeof(tmp2) > 2)
|
14179b | 1997-01-29 | Per Hedbor | | nx=tmp2[-2];
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | | if (nx && (tmp2 = types_fun(nx)))
|
14179b | 1997-01-29 | Per Hedbor | | tmp[0] = tmp2[0];
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | | else if (tmp2 = types_fun("default"))
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | tmp[0] = tmp2[0];
|
14179b | 1997-01-29 | Per Hedbor | | else
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | | tmp[0] = "application/octet-stream";
|
14179b | 1997-01-29 | Per Hedbor | | }
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | | } else if (!(tmp = types_fun("default"))) {
|
9be5aa | 1998-07-03 | Henrik Grubbström (Grubba) | | 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);
|
0e1f26 | 2002-01-29 | Martin Stjernholm | | mixed 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));
|
0e1f26 | 2002-01-29 | Martin Stjernholm | | if(error) {
report_debug("Error in map_providers(): " + 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])) {
|
a51a90 | 2001-11-12 | Martin Stjernholm | | mixed ret;
if (ret = f(@args)) {
return ret;
|
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 | | {
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | | if(!file_extension_module_cache[ext = lower_case(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/"::";
|
9934d6 | 2001-09-05 | Jonas Wallden | |
id->not_query = a[0];
|
ca44e5 | 1998-07-02 | Henrik Grubbström (Grubba) | | 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;
}
|
4d1023 | 2001-06-26 | Per Hedbor | | void set_userdb_module_cache( array to )
{
userdb_module_cache = to;
}
|
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 | | {
|
6533f2 | 2001-08-23 | Martin Nilsson | |
foreach(logger_module_cache||logger_modules(), function 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 )
|
6533f2 | 2001-08-23 | Martin Nilsson | | 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)
|
6533f2 | 2001-08-23 | Martin Nilsson | |
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd8192 | 2000-09-19 | Johan Sundström | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
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 ) )
|
ac7745 | 2001-06-13 | Per Hedbor | | return uid->compat_userinfo(id);
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | array(string) userlist(RequestID|void id)
|
6533f2 | 2001-08-23 | Martin Nilsson | |
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd8192 | 2000-09-19 | Johan Sundström | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3342dd | 2001-01-19 | Per Hedbor | | array(string) list = ({});
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | list |= m->list_users(id);
|
3342dd | 2001-01-19 | Per Hedbor | | return list;
|
14179b | 1997-01-29 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | array(string) user_from_uid(int u, RequestID|void id)
|
6533f2 | 2001-08-23 | Martin Nilsson | |
|
3342dd | 2001-01-19 | Per Hedbor | |
|
cd8192 | 2000-09-19 | Johan Sundström | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
14179b | 1997-01-29 | Per Hedbor | | {
|
3342dd | 2001-01-19 | Per Hedbor | | User uid;
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | if( uid = m->find_user_from_uid( u,id ) )
|
3342dd | 2001-01-19 | Per Hedbor | | 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 )
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | | {
User uid;
|
d2fcaf | 2001-01-30 | Per Hedbor | | if( id && id->misc->authenticated_user
|
ac7745 | 2001-06-13 | Per Hedbor | | && ( uid = id->misc->authenticated_user->database->find_user(user,id)))
|
96d86e | 2001-01-29 | Per Hedbor | | return uid;
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | if( uid = m->find_user( user,id ) )
|
96d86e | 2001-01-29 | Per Hedbor | | return uid;
}
|
ac7745 | 2001-06-13 | Per Hedbor | | array(string) list_users(RequestID|void id)
|
d2fcaf | 2001-01-30 | Per Hedbor | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
d2fcaf | 2001-01-30 | Per Hedbor | | {
array(string) list = ({});
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | list |= m->list_users(id);
|
d2fcaf | 2001-01-30 | Per Hedbor | | return list;
}
|
ac7745 | 2001-06-13 | Per Hedbor | | array(string) list_groups(RequestID|void id)
|
d2fcaf | 2001-01-30 | Per Hedbor | |
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
d2fcaf | 2001-01-30 | Per Hedbor | | {
array(string) list = ({});
foreach( user_databases(), UserDB m )
|
ac7745 | 2001-06-13 | Per Hedbor | | list |= m->list_groups(id);
|
d2fcaf | 2001-01-30 | Per Hedbor | | return list;
}
|
96d86e | 2001-01-29 | Per Hedbor | | Group find_group( string group, RequestID|void id )
|
ac7745 | 2001-06-13 | Per Hedbor | |
|
96d86e | 2001-01-29 | Per Hedbor | | {
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 )
|
ac7745 | 2001-06-13 | Per Hedbor | | if( uid = m->find_group( group,id ) )
|
96d86e | 2001-01-29 | Per Hedbor | | 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
|
aca6ab | 2002-06-10 | Martin Stjernholm | | private mapping misc_cache = set_weak_flag (([]), 1);
|
14179b | 1997-01-29 | Per Hedbor | |
|
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))
|
5a4293 | 2001-08-30 | Per Hedbor | |
|
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] )
|
5a4293 | 2001-08-30 | Per Hedbor | |
|
bc0fa0 | 2001-03-08 | Per Hedbor | | 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
|
db5f6b | 2001-07-31 | Per Hedbor | |
id->not_query = VFS.normalize_path( id->not_query );
|
5655dc | 2001-06-06 | Per Hedbor | |
|
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":
|
d738ba | 2002-04-10 | Jonas Wallden | |
id->misc->cacheable = 9999;
|
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;",
|
2f51ba | 2002-03-22 | Martin Stjernholm | | "type":"image/gif",
"stat": ({0, 0, 0, 900000000, 0, 0, 0})]);
|
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..])),
|
2f51ba | 2002-03-22 | Martin Stjernholm | | "type":"image/gif",
"stat": ({0, 0, 0, 900000000, 0, 0, 0})]);
|
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 | |
|
9ac033 | 2002-11-05 | Anders Johansson | | if(has_prefix(file, internal_location))
|
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;
|
9ac033 | 2002-11-05 | Anders Johansson | | if(2==sscanf(file[strlen(internal_location)..], "%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);
|
471705 | 2001-05-07 | Per Hedbor | | PROF_ENTER("find_internal","location");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | LOCK(find_internal);
fid=find_internal( rest, id );
UNLOCK();
|
02c664 | 2001-08-22 | Martin Stjernholm | |
TRACE_LEAVE("");
|
471705 | 2001-05-07 | Per Hedbor | | PROF_LEAVE("find_internal","location");
|
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 | | {
|
471705 | 2001-05-07 | Per Hedbor | | PROF_ENTER(Roxen.get_owning_module(funp)->module_name,"url module");
|
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();
|
471705 | 2001-05-07 | Per Hedbor | | PROF_LEAVE(Roxen.get_owning_module(funp)->module_name,"url module");
|
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 ))
{
|
a51a90 | 2001-11-12 | Martin Stjernholm | | mixed 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
|
7937df | 2001-05-16 | Per Hedbor | | PROF_ENTER(Roxen.get_owning_module(tmp[1])->module_name,"location");
|
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("");
|
7937df | 2001-05-16 | Per Hedbor | | PROF_LEAVE(Roxen.get_owning_module(tmp[1])->module_name,"location");
|
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))
{
|
a0e5a4 | 2003-06-10 | Anders Johansson | | TRACE_LEAVE("");
|
5839c3 | 1999-01-22 | Marcus Comstedt | | 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]);
|
a0e5a4 | 2003-06-10 | Anders Johansson | | TRACE_LEAVE("");
|
434bac | 2000-07-14 | Andreas Lange | | 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)
{
|
7937df | 2001-05-16 | Per Hedbor | | PROF_ENTER(dir_module->module_name,"directory");
|
14179b | 1997-01-29 | Per Hedbor | | 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);
|
a0e5a4 | 2003-06-10 | Anders Johansson | | TRACE_LEAVE("");
|
14179b | 1997-01-29 | Per Hedbor | | UNLOCK();
|
7937df | 2001-05-16 | Per Hedbor | | PROF_LEAVE(dir_module->module_name,"directory");
|
14179b | 1997-01-29 | Per Hedbor | | }
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) &&
|
f511c5 | 2001-08-31 | Per Hedbor | | (tmp = file_extension_modules(loc =
lower_case(Roxen.extension(id->not_query,
id)))))
|
517c7e | 2000-09-30 | Per Hedbor | | {
|
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
|
7937df | 2001-05-16 | Per Hedbor | | PROF_ENTER(Roxen.get_owning_module(funp)->module_name,"ext");
|
14179b | 1997-01-29 | Per Hedbor | | LOCK(funp);
tmp=funp(fid, loc, id);
UNLOCK();
|
7937df | 2001-05-16 | Per Hedbor | | PROF_LEAVE(Roxen.get_owning_module(funp)->module_name,"ext");
|
14179b | 1997-01-29 | Per Hedbor | | 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;
|
f511c5 | 2001-08-31 | Per Hedbor | | loc = lower_case(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;
|
483b06 | 2002-05-16 | Stefan Wallström | | RequestID root_id = id->root_id || id;
root_id->misc->_request_depth++;
if(sub_req_limit && root_id->misc->_request_depth > sub_req_limit)
|
9ac033 | 2002-11-05 | Anders Johansson | | error("Subrequest limit reached. (Possibly an insertion loop.)");
|
576c11 | 2000-03-07 | Martin Stjernholm | |
|
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);
|
471705 | 2001-05-07 | Per Hedbor | | PROF_ENTER(Roxen.get_owning_module(tmp)->module_name,"filter");
|
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("");
|
471705 | 2001-05-07 | Per Hedbor | | PROF_LEAVE(Roxen.get_owning_module(tmp)->module_name,"filter");
|
41d0f9 | 1998-02-20 | Per Hedbor | | }
|
9c1900 | 2001-02-27 | Per Hedbor | | TIMER_END(filter_modules);
|
576c11 | 2000-03-07 | Martin Stjernholm | |
|
483b06 | 2002-05-16 | Stefan Wallström | | root_id->misc->_request_depth--;
|
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) | | {
|
a51a90 | 2001-11-12 | Martin Stjernholm | | mixed err;
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | 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;
|
a51a90 | 2001-11-12 | Martin Stjernholm | | mixed err;
|
f12890 | 1997-08-15 | Henrik Grubbström (Grubba) | | 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
|
1371e0 | 2001-06-22 | Martin Nilsson | | mapping res = Roxen.http_rxml_answer( data, id, 0, "text/html" );
res->error = 404;
return res;
|
73ce3d | 2000-12-11 | Per Hedbor | | }
|
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 ))
{
|
a51a90 | 2001-11-12 | Martin Stjernholm | | mixed err;
|
a86c6c | 1997-09-22 | Henrik Grubbström (Grubba) | | 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;
}
}
}
|
742477 | 2002-11-05 | Anders Johansson | | array(int)|Stat try_stat_file(string s, RequestID id, int|void not_internal)
{
RequestID fake_id;
array(int)|Stat res;
if(!objectp(id))
error("No ID passed to 'try_stat_file'\n");
if ( !id->misc )
id->misc = ([]);
if ( !id->misc->common )
id->misc->common = ([]);
fake_id = id->clone_me();
fake_id->misc->common = id->misc->common;
fake_id->misc->internal_get = !not_internal;
fake_id->conf = this_object();
if (fake_id->scan_for_query)
s = fake_id->scan_for_query (s);
s = Roxen.fix_relative (s, id);
fake_id->raw_url = s;
fake_id->not_query = s;
fake_id->method = "GET";
res = stat_file(fake_id->not_query, fake_id);
destruct (fake_id);
return res;
}
|
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,
|
6a613a | 2002-06-17 | Anders Johansson | | int|void not_internal,
mapping|void result_mapping)
|
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");
|
964473 | 2001-11-27 | Martin Stjernholm | |
if ( !id->misc )
id->misc = ([]);
if ( !id->misc->common )
id->misc->common = ([]);
|
e351dd | 1999-11-29 | Per Hedbor | | fake_id = id->clone_me();
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
964473 | 2001-11-27 | Martin Stjernholm | | fake_id->misc->common = id->misc->common;
|
484ec9 | 2000-06-23 | Martin Stjernholm | | fake_id->misc->internal_get = !not_internal;
|
c8ff27 | 2002-09-20 | Anders Johansson | | fake_id->conf = this_object();
|
e351dd | 1999-11-29 | Per Hedbor | |
|
4e0a53 | 2000-03-20 | Martin Stjernholm | | if (fake_id->scan_for_query)
|
c65dbe | 2001-05-03 | Per Hedbor | |
|
4e0a53 | 2000-03-20 | Martin Stjernholm | | s = fake_id->scan_for_query (s);
|
c65dbe | 2001-05-03 | Per Hedbor | |
s = Roxen.fix_relative (s, id);
|
14179b | 1997-01-29 | Per Hedbor | | fake_id->raw_url=s;
fake_id->not_query=s;
|
7a4150 | 2001-08-30 | Henrik Grubbström (Grubba) | | fake_id->method = "GET";
|
14179b | 1997-01-29 | Per Hedbor | |
|
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;
}
|
6a613a | 2002-06-17 | Anders Johansson | | if (result_mapping)
foreach(indices(m), string i)
result_mapping[i] = m[i];
|
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();
|
2c6659 | 2001-09-06 | Henrik Grubbström (Grubba) | | if (m->file) {
destruct(m->file);
}
|
14179b | 1997-01-29 | Per Hedbor | | 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;
}
|
7345b0 | 2001-09-13 | Martin Nilsson | | int(0..1) is_file(string virt_path, RequestID id, int(0..1)|void internal)
|
14179b | 1997-01-29 | Per Hedbor | | {
|
7345b0 | 2001-09-13 | Martin Nilsson | | if(internal) {
int(0..1) was_internal = id->misc->internal_get;
id->misc->internal_get = 1;
int(0..1) res = !!stat_file(virt_path, id);
if(!was_internal)
m_delete(id->misc, "internal_get");
return res;
}
if(stat_file(virt_path, id) ||
has_suffix(virt_path, "/internal-roxen-unit"))
return 1;
string f = (virt_path/"/")[-1];
if( sscanf(f, "internal-roxen-%s", f) ) {
if(internal_roxen_image(f, id) ||
has_prefix(f, "pixel-"))
return 1;
return 0;
}
if( sscanf(f, "internal-gopher-%s", f) &&
internal_gopher_image(f) )
return 1;
return 0;
|
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)
{
|
c109fc | 2001-07-21 | Martin Stjernholm | | fix_my_url();
|
55c052 | 2001-11-07 | Henrik Grubbström (Grubba) | | #if 0
report_debug(sprintf("configuration:start():\n"
" registered_urls: ({ %{%O, %}})\n"
|
9c3c6c | 2001-11-09 | Henrik Grubbström (Grubba) | | " failed_urls: ({ %{%O, %}})\n"
|
55c052 | 2001-11-07 | Henrik Grubbström (Grubba) | | " URLs: ({ %{%O, %}})\n",
registered_urls,
failed_urls,
query("URLs")));
#endif /* 0 */
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
5d6c8d | 2000-09-01 | Per Hedbor | | foreach( (registered_urls-query("URLs"))+failed_urls, string url )
{
registered_urls -= ({ url });
|
9c3c6c | 2001-11-09 | Henrik Grubbström (Grubba) | | roxen.unregister_url(url, this_object());
|
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 | |
|
5d6c8d | 2000-09-01 | Per Hedbor | | foreach( (query( "URLs" )-registered_urls), string url )
|
55c052 | 2001-11-07 | Henrik Grubbström (Grubba) | | {
|
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 });
|
55c052 | 2001-11-07 | Henrik Grubbström (Grubba) | | }
|
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;
|
6f669a | 2001-08-14 | Honza Petrous | |
|
b9c387 | 2002-03-27 | Per Hedbor | | if( query("throttle") )
{
if( !throttler )
throttler=.throttler();
throttler->throttle(query("throttle_fill_rate"),
query("throttle_bucket_depth"),
query("throttle_min_grant"),
query("throttle_max_grant"));
}
else if( throttler )
{
throttler->throttle( 1000000000, 1000000000,
1024, 65536 );
throttler = 0;
}
|
6f669a | 2001-08-14 | Honza Petrous | | #ifdef SNMP_AGENT
if(query("snmp_process") && objectp(roxen->snmpagent))
roxen->snmpagent->add_virtserv(get_config_id());
#endif
|
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 | |
|
a2d079 | 2002-04-15 | Marcus Wellhardh | | store( "EnabledModules", enabled_modules, 1, this_object());
|
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] );
|
ffdab5 | 2001-08-24 | Per Hedbor | |
|
f7c574 | 2001-09-03 | Per Hedbor | | roxen->bootstrap_info->set (({this_object(), modname }));
|
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 | |
|
ffdab5 | 2001-08-24 | Per Hedbor | | if( !old_module->not_a_module )
|
b86de8 | 2000-11-13 | Per Hedbor | | {
save_one( old_module );
master()->refresh_inherit( object_program( old_module ) );
master()->refresh( object_program( old_module ), 1 );
}
|
2f7920 | 2000-03-27 | Per Hedbor | |
|
2141a1 | 2001-07-12 | Martin Stjernholm | | array old_error_log = (array) old_module->error_log;
|
2f7920 | 2000-03-27 | Per Hedbor | | RoxenModule nm;
|
2141a1 | 2001-07-12 | Martin Stjernholm | |
|
ffdab5 | 2001-08-24 | Per Hedbor | |
|
795798 | 2001-09-06 | Per Hedbor | | nm = mi->instance( this_object() );
|
ffdab5 | 2001-08-24 | Per Hedbor | |
if( nm->not_a_module )
{
|
9fa11d | 2001-08-24 | Martin Nilsson | | old_module->report_error(LOC_C(385,"Reload failed")+"\n");
|
ffdab5 | 2001-08-24 | Per Hedbor | | return old_module;
}
|
bd86bd | 2001-09-06 | Per Hedbor | | disable_module( modname, 1 );
destruct( old_module );
|
ffdab5 | 2001-08-24 | Per Hedbor | |
mi->update_with( nm,0 );
enable_module( modname, nm, mi );
|
2141a1 | 2001-07-12 | Martin Stjernholm | |
foreach (old_error_log, [string msg, array(int) times])
nm->error_log[msg] += times;
nm->report_notice(LOC_C(11, "Reloaded %s.")+"\n", mi->get_name());
|
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();
|
c6bf40 | 2001-09-10 | Martin Stjernholm | | #define MODULE_LOCK(TYPE) \
Thread.MutexKey enable_modules_lock = enable_modules_mutex->lock (TYPE)
|
beba57 | 2000-03-20 | Martin Stjernholm | | #else
|
c6bf40 | 2001-09-10 | Martin Stjernholm | | #define MODULE_LOCK(TYPE)
|
beba57 | 2000-03-20 | Martin Stjernholm | | #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,
|
e6cd83 | 2002-04-09 | Marcus Wellhardh | | int|void nostart, int|void nosave )
|
14179b | 1997-01-29 | Per Hedbor | | {
|
c6bf40 | 2001-09-10 | Martin Stjernholm | | MODULE_LOCK (2);
|
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;
|
acff93 | 2001-08-14 | Per Hedbor | | if( forcibly_added[modname] == 2 )
|
747a7c | 2001-08-13 | Per Hedbor | | return search(otomod, modname);
|
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 | |
|
1e7925 | 2001-07-11 | Martin Stjernholm | | roxen->bootstrap_info->set (({this_object(), modname + "#" + id}));
|
a42fe4 | 2001-07-05 | Martin Nilsson | | #ifdef MODULE_DEBUG
|
7f0008 | 1998-03-20 | Per Hedbor | | int start_time = gethrtime();
|
a42fe4 | 2001-07-05 | Martin Nilsson | | #endif
|
25171c | 1999-11-06 | Per Hedbor | |
|
2f7920 | 2000-03-27 | Per Hedbor | | if( !moduleinfo )
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | {
|
2e8d0f | 2001-06-28 | Martin Stjernholm | | 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;
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen->bootstrap_info->set (0);
|
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) : "");
|
835c6c | 2001-06-17 | Martin Nilsson | |
|
9a1d47 | 2000-01-12 | Martin Stjernholm | |
|
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;
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen->bootstrap_info->set (0);
|
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 | | {
|
0e1f26 | 2002-01-29 | Martin Stjernholm | | if( module[id]->stop ) {
if (err = catch( module[id]->stop() )) {
string bt=describe_backtrace(err);
report_error("disable_module(): " +
LOC_M(44, "Error while disabling module %s%s"),
descr, (bt ? ":\n"+bt : "\n"));
}
}
|
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|
|
b7b653 | 2002-06-06 | Anders Johansson | | MODULE_FILTER|MODULE_TAG|MODULE_FIRST|
MODULE_USERDB))
|
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}));
}) {
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen->bootstrap_info->set (0);
|
477042 | 1999-11-22 | Henrik Grubbström (Grubba) | | throw(err);
}
|
3b1783 | 1998-11-22 | Per Hedbor | | }
|
10c7e1 | 1999-12-28 | Martin Nilsson | |
|
21306c | 2000-11-02 | Per Hedbor | | #ifdef MODULE_LEVEL_SECURITY
|
b7b653 | 2002-06-06 | Anders Johansson | | if( (module_type & ~(MODULE_LOGGER|MODULE_PROVIDER|MODULE_USERDB)) != 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,
|
89d1d8 | 2001-05-16 | Martin Nilsson | | DLOCALE(245,
|
62e2cb | 2001-03-08 | Per Hedbor | | "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
|
be87a7 | 2002-04-17 | Marcus Wellhardh | | if (enable_module_batch_msgs) {
if(moduleinfo->config_locked[this_object()])
report_debug("\bLocked %6.1fms\n", (gethrtime()-start_time)/1000.0);
else
report_debug("\bOK %6.1fms\n", (gethrtime()-start_time)/1000.0);
}
#else
if(moduleinfo->config_locked[this_object()])
report_error(" Error: \"%s\" not loaded (license restriction).\n",
moduleinfo->get_name());
|
bcf566 | 2000-04-05 | Per Hedbor | | #endif
|
fd24e2 | 2000-08-28 | Per Hedbor | | if( !enabled_modules[modname+"#"+id] )
{
enabled_modules[modname+"#"+id] = 1;
|
e6cd83 | 2002-04-09 | Marcus Wellhardh | | if(!nosave)
store( "EnabledModules", enabled_modules, 1, this_object());
|
fd24e2 | 2000-08-28 | Per Hedbor | | }
|
6f595f | 2000-08-20 | Per Hedbor | |
|
e6cd83 | 2002-04-09 | Marcus Wellhardh | | if (!has_stored_vars && !nosave)
|
bcf566 | 2000-04-05 | Per Hedbor | | 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 | |
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen->bootstrap_info->set (0);
|
bcf566 | 2000-04-05 | Per Hedbor | | return me;
}
void call_start_callbacks( RoxenModule me,
ModuleInfo moduleinfo,
ModuleCopies module )
{
|
a8ba69 | 2000-08-29 | Marcus Wellhardh | | call_low_start_callbacks( me, moduleinfo, module );
|
79538a | 2002-12-10 | Martin Stjernholm | | call_high_start_callbacks (me, moduleinfo);
|
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 )
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | | if(pri[pr]->file_extension_modules[foo = lower_case(foo)] )
pri[pr]->file_extension_modules[foo] += ({me});
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | else
|
0ba038 | 2001-08-28 | Henrik Grubbström (Grubba) | | pri[pr]->file_extension_modules[foo] = ({me});
|
ad683e | 1998-05-09 | 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 | | }
|
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 | | {
|
747a7c | 2001-08-13 | Per Hedbor | | mixed provs = me->query_provides ? me->query_provides() : ({});
|
ad683e | 1998-05-09 | Henrik Grubbström (Grubba) | | 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 | | }
|
79538a | 2002-12-10 | Martin Stjernholm | | void call_high_start_callbacks (RoxenModule me, ModuleInfo moduleinfo)
{
if(!me) return;
if(!moduleinfo) return;
mixed err;
if((me->start) && (err = catch( me->start(0, this_object()) ) ) )
{
#ifdef MODULE_DEBUG
if (enable_module_batch_msgs)
report_debug("\bERROR\n");
#endif
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;
}
if( inited && me->ready_to_receive_requests )
if( mixed q = catch( me->ready_to_receive_requests( this_object() ) ) )
{
#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 ) );
got_no_delayed_load = -1;
}
}
|
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 | |
|
c109fc | 2001-07-21 | Martin Stjernholm | | case "MyWorldLocation":
case "URLs":
fix_my_url();
return 0;
|
b9c387 | 2002-03-27 | Per Hedbor | |
|
e42791 | 2001-06-30 | Honza Petrous | | #ifdef SNMP_AGENT
case "snmp_process":
if (objectp(roxen->snmpagent)) {
int cid = get_config_id();
value ? roxen->snmpagent->add_virtserv(cid) : roxen->snmpagent->del_virtserv(cid);
}
return 0;
#endif
|
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 )
{
|
c6bf40 | 2001-09-10 | Martin Stjernholm | | MODULE_LOCK (2);
|
2f4ac1 | 2000-11-02 | Per Hedbor | | 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 | |
|
5fbaec | 2001-04-11 | Per Hedbor | | if( !nodest )
{
|
a42fe4 | 2001-07-05 | Martin Nilsson | | m_delete( enabled_modules, modname + "#" + id );
|
acff93 | 2001-08-14 | Per Hedbor | | m_delete( forcibly_added, modname + "#" + id );
|
5fbaec | 2001-04-11 | Per Hedbor | | 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 | |
|
d5c864 | 2001-08-23 | Martin Stjernholm | |
|
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;
}
|
acff93 | 2001-08-14 | Per Hedbor | | mapping forcibly_added = ([]);
|
f5a274 | 1999-10-18 | Per Hedbor | | 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
|
747a7c | 2001-08-13 | Per Hedbor | | forcibly_added[ mod+"#0" ] = 1;
|
acff93 | 2001-08-14 | Per Hedbor | | enable_module( mod+"#0" );
forcibly_added[ mod+"#0" ] = 2;
|
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 = ([]);
|
3f059e | 2001-06-24 | Per Hedbor | | constant sql_cache_get = DBManager.sql_cache_get;
|
ed9313 | 1998-07-09 | Johan Schön | |
|
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 | |
|
c109fc | 2001-07-21 | Martin Stjernholm | | static string my_url;
void fix_my_url()
|
14179b | 1997-01-29 | Per Hedbor | | {
|
c109fc | 2001-07-21 | Martin Stjernholm | | my_url = query ("MyWorldLocation");
|
f41857 | 2001-07-21 | Martin Stjernholm | | if (!sizeof (my_url) &&
!(my_url = Roxen.get_world (query ("URLs"))))
|
3ec7cf | 2001-07-21 | Martin Stjernholm | |
my_url = "";
else
if (!has_suffix (my_url, "/")) my_url += "/";
|
14179b | 1997-01-29 | Per Hedbor | | }
|
6b67fe | 2001-08-24 | Martin Nilsson | |
|
c109fc | 2001-07-21 | Martin Stjernholm | | string get_url() {return my_url;}
|
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;
|
c6bf40 | 2001-09-10 | Martin Stjernholm | |
|
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()
{
|
c6bf40 | 2001-09-10 | Martin Stjernholm | | MODULE_LOCK (0);
|
d53f0b | 2000-09-09 | Martin Stjernholm | | 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 | |
|
f7c574 | 2001-09-03 | Per Hedbor | | if (!modules_already_enabled)
{
|
d53f0b | 2000-09-09 | Martin Stjernholm | | enabled_modules = retrieve("EnabledModules", this_object());
|
747a7c | 2001-08-13 | Per Hedbor | |
|
d53f0b | 2000-09-09 | Martin Stjernholm | |
array modules_to_process = indices( enabled_modules );
string tmp_string;
|
0e1f26 | 2002-01-29 | Martin Stjernholm | | mixed err;
|
acff93 | 2001-08-14 | Per Hedbor | | forcibly_added = ([]);
|
d53f0b | 2000-09-09 | Martin Stjernholm | | enable_module_batch_msgs = 1;
foreach( modules_to_process, tmp_string )
{
if( !forcibly_added[ tmp_string ] )
|
747a7c | 2001-08-13 | Per Hedbor | | if(err = catch( enable_module( tmp_string )))
{
report_error(LOC_M(45, "Failed to enable the module %s. Skipping.")
+"\n%s\n", tmp_string, describe_backtrace(err));
|
d53f0b | 2000-09-09 | Martin Stjernholm | | got_no_delayed_load = -1;
}
}
enable_module_batch_msgs = 0;
roxenloader.pop_compile_error_handler();
|
acff93 | 2001-08-14 | Per Hedbor | | forcibly_added = ([]);
|
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);
|
14cf2b | 2001-07-18 | Honza Petrous | |
#ifdef SNMP_AGENT
|
79b7c3 | 2001-09-13 | Honza Petrous | |
if(query("snmp_process") && objectp(roxen->snmpagent))
roxen->snmpagent->vs_start_trap(get_config_id());
|
14cf2b | 2001-07-18 | Honza Petrous | | #endif
|
0f28da | 1997-08-13 | Per Hedbor | | }
|
5f6dae | 2000-08-13 | Per Hedbor | | DataCache datacache;
|
3557f5 | 2001-06-30 | Martin Stjernholm | | static void create()
|
0f28da | 1997-08-13 | Per Hedbor | | {
|
3557f5 | 2001-06-30 | Martin Stjernholm | | if (!name) error ("Configuration name not set through bootstrap_info.\n");
|
851483 | 2000-11-27 | Per Hedbor | |
|
3557f5 | 2001-06-30 | Martin Stjernholm | | roxen.add_permission( "Site:"+name, LOC_C(306,"Site")+": "+name );
|
62e1bb | 2000-11-08 | Per Hedbor | |
|
b0a9ea | 2001-04-18 | Martin Stjernholm | |
|
224f18 | 2002-05-13 | Jonas Wallden | | defvar( "data_cache_size", 16384, 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"));
|
224f18 | 2002-05-13 | Jonas Wallden | | defvar( "data_cache_file_max_size", 100, 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 "
|
0c6279 | 2003-01-21 | Martin Stjernholm | | "the cache, in KBytes."));
|
5f6dae | 2000-08-13 | Per Hedbor | |
|
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"),
|
b98c02 | 2001-07-31 | Per Hedbor | | TYPE_STRING|VAR_MORE| VAR_PUBLIC|VAR_NO_DEFAULT,
|
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 (
|
b98c02 | 2001-07-31 | Per Hedbor | | "", roxen.compat_levels, VAR_NO_DEFAULT,
|
89d1d8 | 2001-05-16 | Martin Nilsson | | DLOCALE(246, "Compatibility level"),
|
295f8d | 2002-08-13 | Martin Stjernholm | | DLOCALE(386, #"\
<p>The compatibility level is used by different modules to select the
right behavior to remain compatible with earlier Roxen versions. When
a server configuration is created, this variable is set to the current
version. After that it's never changed automatically, thereby ensuring
that server configurations migrated from earlier Roxen versions is
kept at the right compatibility level.</p>
<p>This variable may be changed manually, but it's advisable to test
the site carefully afterwards. A reload of the whole server
configuration is required to propagate the change properly to all
modules.</p>
<p>Available compatibility levels:
<table>
<tr valign='top'><td>2.1 </td>
<td>Corresponds to Roxen WebServer 2.1.</td></tr>
<tr valign='top'><td>2.2 </td>
<td>Corresponds to Roxen WebServer 2.2.</td></tr>
<tr valign='top'><td>2.4 </td>
<td>Corresponds to Roxen WebServer 2.4. This version is also
commonly known as 3.2 - the version number that applies to the
release of Roxen CMS which contains Roxen WebServer 2.4.</td></tr>
<tr valign='top'><td>2.5 </td>
<td>Corresponds to no released version. This compatibility level is
only used to turn on some optimizations that have compatibility
issues with 2.4, notably the optimization of cache static tags in
the <cache> tag.</td></tr>
|
e3cb7d | 2002-09-02 | Martin Stjernholm | | <tr valign='top'><td>3.3 </td>
|
b4f65c | 2003-01-13 | Martin Stjernholm | | <td>Corresponds to Roxen 3.3.</td></tr>
<tr valign='top'><td>3.4 </td>
<td>Corresponds to Roxen 3.4.</td></tr>
|
295f8d | 2002-08-13 | Martin Stjernholm | | </table></p>")));
|
b0a9ea | 2001-04-18 | Martin Stjernholm | | set ("compat_level", roxen.__roxen_version__);
|
7848ae | 2001-06-15 | Martin Stjernholm | |
|
b0a9ea | 2001-04-18 | Martin Stjernholm | |
|
5467e9 | 2001-10-05 | Per Hedbor | | defvar("Log", 1, DLOCALE(28, "Logging: Enabled"),
TYPE_FLAG, DLOCALE(29, "Log requests"));
|
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,
|
46d4cb | 2001-08-22 | Martin Stjernholm | | DLOCALE(27, #"What format to use for logging. The syntax is:
<pre>response-code or *: Log format for that response code
Log format is normal characters, or one or more of the variables below:
|
0e20f3 | 2002-05-29 | Anders Johansson | | \\n \\t \\r -- As in C, newline, tab and linefeed
$char(int) -- Insert the (1 byte) character specified by the integer.
$wchar(int) -- Insert the (2 byte) word specified by the integer.
$int(int) -- Insert the (4 byte) word specified by the integer.
$^ -- Supress newline at the end of the logentry
$host -- The remote host name, or ip number.
$vhost -- The Host request-header sent by the client, or - if none
$ip_number -- The remote ip number.
$bin-ip_number -- The remote host id as a binary integer number.
$cern_date -- Cern Common Log file format date.
$bin-date -- Time, but as an 32 bit integer in network byteorder
$method -- Request method
$resource -- Resource identifier
$full_resource -- Full requested resource, including any query fields
$protocol -- The protocol used (normally HTTP/1.0)
$response -- The response code sent
$bin-response -- The response code sent as a binary short number
$length -- The length of the data section of the reply
$bin-length -- Same, but as an 32 bit integer in network byteorder
$request-time -- The time the request took (seconds)
$referer -- The header 'referer' from the request, or '-'.
$user_agent -- The header 'User-Agent' from the request, or '-'.
|
f9ce96 | 2002-05-29 | Anders Johansson | | $user_agent_raw -- Same, but spaces in the name are not encoded to %20.
|
0e20f3 | 2002-05-29 | Anders Johansson | | $user -- the name of the auth user used, if any
$user_id -- A unique user ID, if cookies are supported,
by the client, otherwise '0'
$cache-status -- A comma separated list of words (containing no
whitespace) that describes which cache(s) the page
was delivered from:
protcache -- The low-level cache in the HTTP
protocol module.
xsltcache -- The XSLT cache.
pcoderam -- RXML parse tree RAM cache.
pcodedisk -- RXML parse tree persistent cache.
cachetag -- No RXML <cache> tag misses.
nocache -- No hit in any known cache.
|
46d4cb | 2001-08-22 | Martin Stjernholm | | </pre>"), 0, lambda(){ return !query("Log");});
|
b796b5 | 1998-11-18 | 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"),
|
b98c02 | 2001-07-31 | Per Hedbor | | TYPE_STRING|VAR_PUBLIC|VAR_NO_DEFAULT,
|
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 | |
|
f41857 | 2001-07-21 | Martin Stjernholm | | defvar("MyWorldLocation", "",
|
e115bf | 2001-08-28 | Per Hedbor | | DLOCALE(36, "Ports: Primary Server URL"), TYPE_URL|VAR_PUBLIC,
|
f41857 | 2001-07-21 | Martin Stjernholm | | DLOCALE(37, #"\
This is the main server URL, where your start page is located. This
setting is for instance used as fallback to generate absolute URLs to
the server, but in most circumstances the URLs sent by the clients are
used. A URL is deduced from the first entry in 'URLs' if this is left
blank.
<p>Note that setting this doesn't make the server accessible; you must
also set 'URLs'."));
|
434bac | 2000-07-14 | Andreas Lange | |
|
c551f2 | 2000-07-04 | Per Hedbor | | defvar("URLs",
|
b98c02 | 2001-07-31 | Per Hedbor | | Variable.PortList( ({"http://*/"}), VAR_INITIAL|VAR_NO_DEFAULT,
|
3b3eac | 2001-09-03 | Martin Nilsson | | DLOCALE(38, "Ports: URLs"),
|
55c052 | 2001-11-07 | Henrik Grubbström (Grubba) | | DLOCALE(373, "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 "
|
21182a | 2001-10-05 | Per Hedbor | | "all IP-numbers on your machine). If you specify a IP# in "
"the field it will take precedence over the hostname.")));
|
c5e096 | 1999-10-04 | Per Hedbor | |
|
9ac033 | 2002-11-05 | Anders Johansson | | defvar("InternalLoc", internal_location,
|
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 "
|
9ac033 | 2002-11-05 | Anders Johansson | | "resources."))
->add_changed_callback(lambda(object v) { internal_location = v->query(); });
|
483b06 | 2002-05-16 | Stefan Wallström | |
|
9ac033 | 2002-11-05 | Anders Johansson | | defvar("SubRequestLimit", sub_req_limit,
|
483b06 | 2002-05-16 | Stefan Wallström | | "Subrequest depth limit",
TYPE_INT | VAR_MORE,
"A limit for the number of nested sub requests for each request. "
|
9ac033 | 2002-11-05 | Anders Johansson | | "This is intented to catch unintended infinite loops when for "
"example inserting files in RXML. 0 for no limit." )
->add_changed_callback(lambda(object v) { sub_req_limit = v->query(); });
|
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." ) );
|
be918b | 2002-02-26 | Marcus Wellhardh | | defvar("license",
|
66e4c0 | 2002-02-27 | Marcus Wellhardh | | License.
LicenseVariable("../license/", VAR_NO_DEFAULT,
|
7aa8ac | 2002-06-05 | Anders Johansson | | DLOCALE(39, "License file"),
DLOCALE(336, "The license file for this configuration."),
|
66e4c0 | 2002-02-27 | Marcus Wellhardh | | this_object()));
|
be918b | 2002-02-26 | Marcus Wellhardh | |
|
9fbde2 | 2000-11-06 | Per Hedbor | |
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() );
|
b82d0f | 2001-08-01 | Per Hedbor | | defvar("404-message", #"<html><head>
|
94d475 | 2000-04-05 | Martin Nilsson | | <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\">
|
f99798 | 2002-05-29 | Jonas Wallden | | <if variable='roxen.product-name is Roxen CMS'>
<b>Roxen CMS </b>
</if>
<else>
<b>Roxen WebServer &roxen.base-version; </b>
</else>
</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>
|
7146cf | 2002-03-13 | Henrik Grubbström (Grubba) | | </html>
|
94d475 | 2000-04-05 | Martin Nilsson | | ",
|
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 | |
|
e42791 | 2001-06-30 | Honza Petrous | | #ifdef SNMP_AGENT
defvar("snmp_process", 0,
"SNMP: Enabled",TYPE_FLAG,
"If set, per-server objects will be added to the SNMP agent database.",
0, snmp_global_disabled);
defvar("snmp_community", "public:ro",
"SNMP: Community string", TYPE_STRING,
"The community string and access level for manipulation on server "
" specific objects.",
0, snmp_disabled);
|
14cf2b | 2001-07-18 | Honza Petrous | | defvar("snmp_traphosts", ({ }),
|
7e23ea | 2001-09-04 | Honza Petrous | | "SNMP: Trap host URLs", TYPE_STRING_LIST,
"The remote nodes, where should be sent traps."
"<p>\n"
"The URL syntax is: snmptrap://community@hostname:portnumber"
"</p><br/>",
0, snmp_disabled);
|
e42791 | 2001-06-30 | Honza Petrous | |
if (query("snmp_process")) {
if(objectp(roxen()->snmpagent)) {
int servid;
|
12e6ea | 2001-07-19 | Honza Petrous | | servid = roxen()->snmpagent->add_virtserv(get_config_id());
|
e42791 | 2001-06-30 | Honza Petrous | |
|
14cf2b | 2001-07-18 | Honza Petrous | |
|
e42791 | 2001-06-30 | Honza Petrous | | } else
report_error("SNMPagent: something gets wrong! The main agent is disabled!\n"); }
#endif
|
12e6ea | 2001-07-19 | Honza Petrous | |
definvisvar( "no_delayed_load", 0, TYPE_FLAG|VAR_PUBLIC );
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 | | }
|
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 | | }
|
e42791 | 2001-06-30 | Honza Petrous | |
#ifdef SNMP_AGENT
private static int(0..1) snmp_disabled() {
return (!snmp_global_disabled() && !query("snmp_process"));
}
|
14cf2b | 2001-07-18 | Honza Petrous | | private static int(0..1) snmp_global_disabled() {
return (!objectp(roxen->snmpagent));
}
|
e42791 | 2001-06-30 | Honza Petrous | | #endif
|