a89693 | 2001-01-03 | Per Hedbor | | #include <stat.h>
#include <config.h>
|
3e3bab | 2001-01-19 | Per Hedbor | | #include <module_constants.h>
|
e734d5 | 2001-02-18 | Mirar (Pontus Hagland) | | constant cvs_version="$Id: prototypes.pike,v 1.16 2001/02/18 13:40:53 mirar Exp $";
|
a89693 | 2001-01-03 | Per Hedbor | |
class Variable
{
constant is_variable = 1;
constant type = "Basic";
string get_warnings();
int get_flags();
void set_flags( int flags );
int check_visibility( RequestID id,
int more_mode,
int expert_mode,
int devel_mode,
int initial,
int|void variable_in_cfif );
void set_invisibility_check_callback( function(RequestID,Variable:int) cb );
function(Variable:void) get_changed_callback( );
void set_changed_callback( function(Variable:void) cb );
void add_changed_callback( function(Variable:void) cb );
function(RequestID,Variable:int) get_invisibility_check_callback() ;
string doc( );
string name( );
string type_hint( );
mixed default_value();
void set_warning( string to );
int set( mixed to );
int low_set( mixed to );
mixed query();
int is_defaulted();
array(string|mixed) verify_set( mixed new_value );
mapping(string:string) get_form_vars( RequestID id );
mixed transform_from_form( string what );
void set_from_form( RequestID id );
string path();
void set_path( string to );
string render_form( RequestID id, void|mapping additional_args );
string render_view( RequestID id );
}
class BasicDefvar
{
mapping(string:Variable) variables=([]);
Variable getvar( string name );
int deflocaledoc( string locale, string variable,
string name, string doc, mapping|void translate );
void set(string var, mixed value);
int killvar(string var);
void setvars( mapping (string:mixed) vars );
Variable defvar(string var, mixed value,
mapping|string|void|object name,
int|void type,
mapping|string|void|object doc_str,
mixed|void misc,
int|function|void not_in_config,
mapping|void option_translations);
mixed query(string|void var, int|void ok);
void definvisvar(string name, mixed value, int type, array|void misc);
}
class StringFile( string data, mixed|void _st )
{
int offset;
string _sprintf()
{
return "StringFile("+strlen(data)+","+offset+")";
}
string read(int nbytes)
{
if(!nbytes)
{
offset = strlen(data);
return data;
}
string d = data[offset..offset+nbytes-1];
offset += strlen(d);
return d;
}
array stat()
{
if( _st ) return (array)_st;
return ({ 0, strlen(data), time(), time(), time(), 0, 0, 0 });
}
void write(mixed ... args)
{
throw( ({ "File not open for write\n", backtrace() }) );
}
void seek(int to)
{
offset = to;
}
}
class ModuleInfo
{
string sname;
string filename;
int last_checked;
int type, multiple_copies;
string get_name();
string get_description();
RoxenModule instance( object conf, void|int silent );
void save();
void update_with( RoxenModule mod, string what );
int init_module( string what );
int rec_find_module( string what, string dir );
int find_module( string sn );
int check (void|int force);
}
class ModuleCopies
{
mapping copies = ([]);
mixed `[](mixed q )
{
return copies[q];
}
mixed `[]=(mixed q,mixed w )
{
return copies[q]=w;
}
array _indices()
{
return indices(copies);
}
array _values()
{
return values(copies);
}
|
4d7e51 | 2001-01-16 | Martin Nilsson | | string _sprintf( ) { return "ModuleCopies("+sizeof(copies)+")"; }
|
a89693 | 2001-01-03 | Per Hedbor | | }
class Configuration
{
inherit BasicDefvar;
constant is_configuration = 1;
mapping enabled_modules = ([]);
mapping(string:array(int)) error_log=([]);
#ifdef PROFILE
mapping profile_map = ([]);
#endif
class Priority
{
string _sprintf()
{
return "Priority()";
}
array (RoxenModule) url_modules = ({ });
array (RoxenModule) logger_modules = ({ });
array (RoxenModule) location_modules = ({ });
array (RoxenModule) filter_modules = ({ });
array (RoxenModule) last_modules = ({ });
array (RoxenModule) first_modules = ({ });
mapping (string:array(RoxenModule)) file_extension_modules = ([ ]);
mapping (RoxenModule:multiset(string)) provider_modules = ([ ]);
#define CATCH(P,X) do{mixed e;if(e=catch{X;})report_error("While "+P+"\n"+describe_backtrace(e));}while(0)
array(RoxenModule) stop()
{
foreach(url_modules, RoxenModule m)
CATCH("stopping url modules",m->stop && m->stop());
foreach(logger_modules, RoxenModule m)
CATCH("stopping logging modules",m->stop && m->stop());
foreach(filter_modules, RoxenModule m)
CATCH("stopping filter modules",m->stop && m->stop());
foreach(location_modules, RoxenModule m)
CATCH("stopping location modules",m->stop && m->stop());
foreach(last_modules, RoxenModule m)
CATCH("stopping last modules",m->stop && m->stop());
foreach(first_modules, RoxenModule m)
CATCH("stopping first modules",m->stop && m->stop());
foreach(indices(provider_modules), RoxenModule m)
CATCH("stopping provider modules",m->stop && m->stop());
return url_modules + logger_modules + filter_modules + location_modules +
last_modules + first_modules + indices (provider_modules);
}
}
class DataCache
{
int current_size, max_size, max_file_size;
int hits, misses;
void flush();
void expire_entry( string url );
void set( string url, string data, mapping meta, int expire );
array(string|mapping(string:mixed)) get( string url );
void init_from_variables( );
};
array(Priority) allocate_pris();
object throttler;
RoxenModule types_module;
RoxenModule dir_module;
function types_fun;
string name;
int inited;
int requests, sent, hsent, received;
function(string:int) log_function;
DataCache datacache;
int get_config_id();
string get_doc_for( string region, string variable );
string query_internal_location(RoxenModule|void mod);
string query_name();
string comment();
void stop();
string type_from_filename( string file, int|void to, string|void myext );
array (RoxenModule) get_providers(string provides);
RoxenModule get_provider(string provides);
array(mixed) map_providers(string provides, string fun, mixed ... args);
mixed call_provider(string provides, string fun, mixed ... args);
array(function) file_extension_modules(string ext);
array(function) url_modules();
mapping api_functions(void|RequestID id);
array(function) logger_modules();
array(function) last_modules();
array(function) first_modules();
array location_modules();
array(function) filter_modules();
void init_log_file();
int|mapping check_security(function|object a, RequestID id, void|int slevel);
void invalidate_cache();
void clear_memory_caches();
string examine_return_mapping(mapping m);
mapping|int(-1..0) low_get_file(RequestID id, int|void no_magic);
mapping get_file(RequestID id, int|void no_magic, int|void internal_get);
array(string) find_dir(string file, RequestID id, void|int(0..1) verbose);
|
ce6427 | 2001-01-14 | Martin Nilsson | | array(int)|object(Stdio.Stat) stat_file(string file, RequestID id);
|
a89693 | 2001-01-03 | Per Hedbor | | array open_file(string fname, string mode, RequestID id, void|int ig);
mapping(string:array(mixed)) find_dir_stat(string file, RequestID id);
array access(string file, RequestID id);
string real_file(string file, RequestID id);
int|string try_get_file(string s, RequestID id,
int|void status, int|void nocache,
int|void not_internal);
int(0..1) is_file(string virt_path, RequestID id);
void start(int num);
void save_me();
int save_one( RoxenModule o );
RoxenModule reload_module( string modname );
RoxenModule enable_module( string modname, RoxenModule|void me,
ModuleInfo|void moduleinfo,
int|void nostart );
void call_start_callbacks( RoxenModule me,
ModuleInfo moduleinfo,
ModuleCopies module );
void call_low_start_callbacks( RoxenModule me,
ModuleInfo moduleinfo,
ModuleCopies module );
int disable_module( string modname, int|void nodest );
int add_modules( array(string) mods, int|void now );
RoxenModule find_module(string name);
|
850c28 | 2001-01-10 | Per Hedbor | | #if ROXEN_COMPAT < 2.2
Sql.Sql sql_cache_get(string what);
Sql.Sql sql_connect(string db);
#endif
|
a89693 | 2001-01-03 | Per Hedbor | | void enable_all_modules();
void low_init(void|int modules_already_enabled);
string parse_rxml(string what, RequestID id,
void|Stdio.File file,
void|mapping defines );
void add_parse_module (RoxenModule mod);
void remove_parse_module (RoxenModule mod);
string real_file(string a, RequestID b);
|
649529 | 2001-01-19 | Per Hedbor | |
mapping authenticate_throw( RequestID id, string realm,
UserDB|void database,
AuthModule|void method);
User authenticate( RequestID id,
UserDB|void database,
AuthModule|void method );
array(AuthModule) auth_modules();
array(UserDB) user_databases();
|
e3f466 | 2001-01-19 | Per Hedbor | | AuthModule find_auth_module( string name );
UserDB find_user_database( string name );
|
a89693 | 2001-01-03 | Per Hedbor | | static string _sprintf( )
{
return "Configuration("+name+")";
}
}
class Protocol
{
inherit BasicDefvar;
constant name = "unknown";
constant supports_ipless = 0;
constant requesthandlerfile = "";
constant default_port = 4711;
int bound;
int refs;
program requesthandler;
string path;
int port;
string ip;
array(string) sorted_urls = ({});
mapping(string:mapping) urls = ([]);
void ref(string url, mapping data);
void unref(string url);
Configuration find_configuration_for_url( string url, RequestID id,
int|void no_default );
string get_key();
void save();
void restore();
};
|
e0ffe3 | 2001-02-05 | Per Hedbor | | class FakedVariables( mapping real_variables )
{
static array _indices()
{
return indices( real_variables );
}
static array _values()
{
return map( _indices(), `[] );
}
static mixed fix_value( mixed what )
{
if( !what ) return what;
if( !arrayp(what) ) return what;
if( sizeof( what ) == 1 )
return what[0];
return what*"\0";
}
static mixed `[]( string ind ) {
return fix_value( real_variables[ ind ] );
}
static mixed `->(string ind ) {
return `[]( ind );
}
static mixed `[]=( string ind, mixed what ) {
real_variables[ ind ] = ({ what });
return what;
}
static mixed `->=(string ind, mixed what ) {
return `[]=( ind,what );
}
static mixed _m_delete( mixed what ) {
|
062634 | 2001-02-07 | Per Hedbor | |
|
e0ffe3 | 2001-02-05 | Per Hedbor | | return fix_value( m_delete( real_variables, what ) );
}
static int _equal( mixed what ) {
return `==(what);
}
static int `==( mixed what ) {
if( mappingp( what ) && (real_variables == what) )
return 1;
}
static string _sprintf( int f )
{
switch( f )
{
case 'O':
return sprintf( "FakedVariables(%O)", real_variables );
default:
return sprintf( sprintf("%%%c", f ), real_variables );
}
}
static this_program `|( mapping what )
{
foreach( indices(what), string q )`[]=( q,what[q] );
return this_object();
}
static this_program `+=( mapping what )
{
foreach( indices(what), string q )`[]=( q,what[q] );
return this_object();
}
static this_program `+( mapping what )
{
foreach( indices(what), string q )`[]=( q,what[q] );
return this_object();
}
|
e734d5 | 2001-02-18 | Mirar (Pontus Hagland) | |
static mapping cast(string to)
{
if (to[..6]=="mapping")
return copy_value(real_variables);
error("can't cast to %O\n",to);
}
|
e0ffe3 | 2001-02-05 | Per Hedbor | | }
|
a89693 | 2001-01-03 | Per Hedbor | | class RequestID
{
Configuration conf;
Protocol port_obj;
int time;
string raw_url;
int do_not_disconnect;
|
e0ffe3 | 2001-02-05 | Per Hedbor | | mapping (string:array) real_variables;
|
a89693 | 2001-01-03 | Per Hedbor | |
|
e0ffe3 | 2001-02-05 | Per Hedbor | |
|
a89693 | 2001-01-03 | Per Hedbor | |
|
e0ffe3 | 2001-02-05 | Per Hedbor | | FakedVariables variables;
|
a89693 | 2001-01-03 | Per Hedbor | | mapping (string:mixed) misc;
mapping (string:string) cookies;
mapping (string:string) request_headers;
mapping (string:mixed) throttle;
mapping (string:mixed) client_var;
multiset(string) prestate;
multiset(string) config;
multiset(string) supports;
multiset(string) pragma;
array(string) client;
array(string) referer;
Stdio.File my_fd;
string prot;
string clientprot;
string method;
string realfile;
string virtfile;
string rest_query;
string raw;
string query;
string not_query;
string extra_extension;
string data;
string leftovers;
string rawauth;
string realauth;
string since;
string remoteaddr;
string host;
static void create(Stdio.File fd, Protocol port, Configuration conf){}
void send(string|object what, int|void len){}
string scan_for_query( string f )
{
if(sscanf(f,"%s?%s", f, query) == 2)
{
string v, a, b;
foreach(query / "&", v)
if(sscanf(v, "%s=%s", a, b) == 2)
{
a = _Roxen.http_decode_string(replace(a, "+", " "));
b = _Roxen.http_decode_string(replace(b, "+", " "));
if(variables[ a ])
variables[ a ] += "\0" + b;
else
variables[ a ] = b;
} else
if(strlen( rest_query ))
rest_query += "&" + _Roxen.http_decode_string( v );
else
rest_query = _Roxen.http_decode_string( v );
rest_query=replace(rest_query, "+", "\000");
}
return f;
}
void end(string|void s, int|void keepit){}
void ready_to_receive(){}
void send_result(mapping|void result){}
RequestID clone_me()
{
object c,t;
c=object_program(t=this_object())(0, port_obj, conf);
c->port_obj = port_obj;
c->conf = conf;
c->time = time;
c->raw_url = raw_url;
c->variables = copy_value(variables);
c->misc = copy_value( misc );
c->misc->orig = t;
c->prestate = prestate;
c->supports = supports;
c->config = config;
c->client_var = client_var;
c->remoteaddr = remoteaddr;
c->host = host;
c->client = client;
c->referer = referer;
c->pragma = pragma;
c->cookies = cookies;
c->my_fd = 0;
c->prot = prot;
c->clientprot = clientprot;
c->method = method;
c->rest_query = rest_query;
c->raw = raw;
c->query = query;
c->not_query = not_query;
c->data = data;
c->extra_extension = extra_extension;
c->realauth = realauth;
c->rawauth = rawauth;
c->since = since;
return c;
}
Stdio.File connection( )
{
return my_fd;
}
Configuration configuration()
{
return conf;
}
}
class RoxenModule
{
inherit BasicDefvar;
constant is_module = 1;
constant module_type = 0;
constant module_unique = 1;
string|mapping(string:string) module_name;
string|mapping(string:string) module_doc;
array(int|string|mapping) register_module();
string file_name_and_stuff();
void start(void|int num, void|object conf);
string query_internal_location();
string query_location();
string query_provides();
array query_seclevels();
|
ce6427 | 2001-01-14 | Martin Nilsson | | array(int)|object(Stdio.Stat) stat_file(string f, RequestID id);
|
a89693 | 2001-01-03 | Per Hedbor | | array(String) find_dir(string f, RequestID id);
mapping(string:array(mixed)) find_dir_stat(string f, RequestID id);
string real_file(string f, RequestID id);
void save();
mapping api_functions();
mapping query_tag_callers();
mapping query_container_callers();
string info(object conf);
string comment();
}
class _roxen
{
mapping(string:object) variables;
string real_version;
object locale;
int start_time;
array(Configuration) configurations;
mixed query(string a);
void store(string a, mapping b, int c, object d);
mapping(string:mixed) retrieve(string a, object b);
void remove(string a, object b);
string version();
void dump(string a);
void nwrite(string a, int|void b, int|void c, void|mixed ... d);
int main(int a, array(string) b);
}
|
3e3bab | 2001-01-19 | Per Hedbor | |
class AuthModule
{
inherit RoxenModule;
constant module_type = MODULE_AUTH;
constant thread_safe=1;
constant name = "method name";
|
3342dd | 2001-01-19 | Per Hedbor | | User authenticate( RequestID id, UserDB db );
|
3e3bab | 2001-01-19 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | | mapping authenticate_throw( RequestID id, string realm, UserDB db );
|
3e3bab | 2001-01-19 | Per Hedbor | |
}
|
69fa3e | 2001-01-30 | Per Hedbor | | static mapping(string:int) user_sql_inited = ([]);
|
a66538 | 2001-01-29 | Per Hedbor | | static Sql.Sql user_mysql;
|
69fa3e | 2001-01-30 | Per Hedbor | | static void init_user_sql(string table)
|
3342dd | 2001-01-19 | Per Hedbor | | {
|
69fa3e | 2001-01-30 | Per Hedbor | | if( !user_mysql )
user_mysql = master()->resolv("DBManager.get")( "shared" );
if(catch(user_mysql->query( "SELECT module FROM "+table+" WHERE module=''")))
user_mysql->query( "CREATE TABLE "+table+" "
" (module varchar(30) NOT NULL, "
|
3342dd | 2001-01-19 | Per Hedbor | | " name varchar(30) NOT NULL, "
|
69fa3e | 2001-01-30 | Per Hedbor | | " user varchar(30) NOT NULL, "
" value blob, "
" raw int not null, "
" INDEX foo (module,name,user))" );
user_sql_inited[ table ] = 1;
|
3342dd | 2001-01-19 | Per Hedbor | | }
class Group( UserDB database )
|
3e3bab | 2001-01-19 | Per Hedbor | | {
string name();
|
3342dd | 2001-01-19 | Per Hedbor | |
|
9b9432 | 2001-01-29 | Per Hedbor | | array(string) members()
|
3342dd | 2001-01-19 | Per Hedbor | |
{
array res = ({});
User uid;
int id = gid();
foreach( database->list_users(), string u )
if( (uid = database->find_user( u )) && (uid->gid() == id) )
|
9b9432 | 2001-01-29 | Per Hedbor | | res += ({ u });
|
3342dd | 2001-01-19 | Per Hedbor | | return res;
}
int gid();
}
class User( UserDB database )
{
|
69fa3e | 2001-01-30 | Per Hedbor | | static string table;
|
3342dd | 2001-01-19 | Per Hedbor | | string name();
|
3e3bab | 2001-01-19 | Per Hedbor | | string real_name();
|
3342dd | 2001-01-19 | Per Hedbor | |
int password_authenticate( string password )
{
return crypt( password, crypted_password() );
}
int uid();
int gid();
string shell();
string gecos()
{
return real_name();
}
string homedir();
string crypted_password() { return "x"; }
|
9b9432 | 2001-01-29 | Per Hedbor | | array(string) groups()
|
e3f466 | 2001-01-19 | Per Hedbor | |
{
return ({});
}
|
3342dd | 2001-01-19 | Per Hedbor | |
|
1d5c89 | 2001-01-19 | Per Hedbor | | int set_name(string name) {}
int set_real_name(string rname) {}
int set_uid(int uid) {}
int set_gid(int gid) {}
int set_shell(string shell) {}
int set_gecos(string gecos) {}
int set_homedir(string hodir) {}
int set_crypted_password(string passwd) {}
int set_password(string passwd) {}
|
3342dd | 2001-01-19 | Per Hedbor | |
array compat_userinfo( )
{
return ({name(),crypted_password(),uid(),gid(),gecos(),homedir(),shell()});
}
|
3e3bab | 2001-01-19 | Per Hedbor | |
|
69fa3e | 2001-01-30 | Per Hedbor | |
#define INIT_SQL() do{ \
if(!table) table = replace(database->my_configuration()->name," ","_")+"_user_variables"; \
if(!user_sql_inited[ table ] )init_user_sql( table ); \
} while( 0 )
static string module_name( RoxenModule module )
{
if( !module )
return "'0'";
else
return replace("'"+user_mysql->quote(module->sname())+"'","%","%%");
}
|
3342dd | 2001-01-19 | Per Hedbor | |
|
1d5c89 | 2001-01-19 | Per Hedbor | | mixed set_var( RoxenModule module, string index, mixed value )
|
3342dd | 2001-01-19 | Per Hedbor | |
|
e3f466 | 2001-01-19 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | |
|
69fa3e | 2001-01-30 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | |
{
delete_var( module, index );
|
69fa3e | 2001-01-30 | Per Hedbor | | mixed oval = value;
INIT_SQL();
|
3342dd | 2001-01-19 | Per Hedbor | | int encoded;
|
69fa3e | 2001-01-30 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | | if( stringp( value ) )
value = string_to_utf8( value );
else
{
value = encode_value( value );
encoded = 1;
}
user_mysql->query(
|
69fa3e | 2001-01-30 | Per Hedbor | | "INSERT INTO "+table+" (module,name,user,value,raw) "
"VALUES ("+module_name( module )+", %s, %s, %s, %d)",
index, name(), value, encoded
|
3342dd | 2001-01-19 | Per Hedbor | | );
|
69fa3e | 2001-01-30 | Per Hedbor | | return oval;
|
3342dd | 2001-01-19 | Per Hedbor | | }
mixed get_var( RoxenModule module, string index )
{
array rows;
|
69fa3e | 2001-01-30 | Per Hedbor | | INIT_SQL();
rows = user_mysql->query( "SELECT * FROM "+table+
" WHERE (module="+module_name( module )
+" AND name=%s AND user=%s)",
|
3342dd | 2001-01-19 | Per Hedbor | | index, name() );
if( !sizeof( rows ) )
return 0;
mapping m = rows[0];
|
69fa3e | 2001-01-30 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | | if( (int)m->raw )
return decode_value( m->value );
return utf8_to_string( m->value );
}
void delete_var( RoxenModule module, string index )
{
|
69fa3e | 2001-01-30 | Per Hedbor | | INIT_SQL();
user_mysql->query( "DELETE FROM "+table+" WHERE (module="+
module_name( module )+
" AND name=%s AND user=%s)", index, name() );
|
3342dd | 2001-01-19 | Per Hedbor | | }
|
69fa3e | 2001-01-30 | Per Hedbor | | #undef INIT_SQL
|
3e3bab | 2001-01-19 | Per Hedbor | | }
class UserDB
{
inherit RoxenModule;
constant module_type = MODULE_USERDB;
|
8ea201 | 2001-01-29 | Per Hedbor | | constant thread_safe=1;
|
3e3bab | 2001-01-19 | Per Hedbor | |
|
e3f466 | 2001-01-19 | Per Hedbor | | constant name = "db name";
|
3e3bab | 2001-01-19 | Per Hedbor | | User find_user( string s );
|
3342dd | 2001-01-19 | Per Hedbor | | User find_user_from_uid( int id )
{
User uid;
foreach( list_users(), string u )
if( (uid = find_user( u )) && (uid->uid() == id) )
return uid;
}
Group find_group( string group )
{
}
User find_group_from_gid( int id )
{
Group uid;
foreach( list_groups(), string u )
if( (uid = find_group( u )) && (uid->gid() == id) )
return uid;
}
array(string) list_groups( )
{
return ({});
}
|
3e3bab | 2001-01-19 | Per Hedbor | | array(string) list_users( );
|
3342dd | 2001-01-19 | Per Hedbor | | User create_user( string s )
|
3e3bab | 2001-01-19 | Per Hedbor | |
|
3342dd | 2001-01-19 | Per Hedbor | |
|
69fa3e | 2001-01-30 | Per Hedbor | | {
return 0;
}
|
3e3bab | 2001-01-19 | Per Hedbor | | }
|