/[pub]/suikawiki/wikidata/suikawiki-config.ph
Suika

Contents of /suikawiki/wikidata/suikawiki-config.ph

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.15 - (hide annotations) (download)
Sun Apr 25 07:13:16 2004 UTC (21 years, 1 month ago) by wakaba
Branch: MAIN
Changes since 1.14: +28 -1 lines
LeafProp database module added; content_prop implemented; Media type property implemented

1 wakaba 1.13 =head1 NAME
2    
3     suikawiki-config.ph - SuikaWiki: Configuration for SuikaWiki HTTP CGI Driver
4    
5     =head1 DESCRIPTION
6    
7     This is a configuration file for SuikaWiki Driver for HTTP CGI Script
8     (SWHCS). Basic options such as WikiDB directory mapping and
9     special purpose WikiPage names can be customized with this file.
10    
11     More complex customizing, e.g. modifying navigation bar or
12     adding new mode, is also possible by config.ph (generated from
13     config.wp2) and WikiPlugin modules. For more information,
14     see <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>.
15    
16     This file is part of SuikaWiki.
17    
18     =cut
19    
20     package wiki::driver::http;
21 w 1.1 use strict;
22 wakaba 1.6
23 wakaba 1.13 ## These lines should be removed after utf8 support
24     BEGIN {
25     $Message::Util::Formatter::Base::Token = qr/[\w._+\x80-\xFF-]+/;
26     require Message::Util::Formatter::Base;
27 wakaba 1.6 }
28 wakaba 1.13 use Message::Util::Error;
29 wakaba 1.6
30 wakaba 1.15 use Message::Util::QName::General [q<ExpandedURI>], {
31     'media-type' => q<http://suika.fam.cx/~wakaba/-temp/2004/04/24/mt#>,
32     };
33    
34 wakaba 1.14 BEGIN {
35     if ($main::ENV{REQUEST_URI} =~ /\#/) {
36     require SuikaWiki::Output::HTTP;
37     my $out = SuikaWiki::Output::HTTP->new;
38     $out->{status_code} = 401;
39     $out->{status_phrase} = q<Request-URI MUST NOT have Fragment Identifier>;
40     $out->{entity}->{media_type} = q<text/html>;
41     $out->{entity}->{charset} = q<iso-8859-1>;
42     $out->{entity}->{language} = [q<en>];
43     $out->{entity}->{body_is_octet_stream} = 1;
44     my $ua = $main::ENV{HTTP_USER_AGENT};
45     for ($ua) {
46     s/&/&amp;/g; s/</&lt;/g; s/([^\x20-\x7E])/sprintf '&#x%02X;', ord $1/ge;
47     };
48     $out->{entity}->{body} = qq<
49     <!DOCTYPE html SYSTEM>
50     <title>401 Bad Request-URI</title>
51     <h1>Bad Request-URI</h1>
52     <p>Your Request-URI has fragment identifier but it is not allowed here.
53     It might be a bug of your user agent ($ua). Please contact to the UA
54     vendor.</p>
55     >;
56     $out->output (output => 'http-cgi');
57     exit;
58     }
59     }
60    
61 wakaba 1.13 push our @Config, sub ($) {
62     my $WIKI = shift;
63     use Cwd qw(abs_path);
64    
65     ## -- Filesystem path mapping
66     for (
67 wakaba 1.14 [db__cache__dir => q"./wikidata/cache/"],
68     [db__cache_struct__file => q"./wikidata/cache/struct.db"],
69 wakaba 1.13 [db__content__dir => q"./wikidata/page/"],
70     [db__content__error_log => q"./wikidata/log/db-content.log"],
71     [db__bdb__home_dir => q"./wikidata/lock/"],
72     [db__bdb__log_dir => q"./wikidata/log/bdb/"],
73     [db__bdb__log_file => q"./wikidata/log/bdb.log"],
74     [db__bdb__temp_dir => q"./wikidata/lock/"],
75     [db__lock__dir => q"./wikidata/lock/"],
76     [db__lock__log_file => q"./wikidata/log/lock.log"],
77     [db__log__dir => q"./wikidata/log/"],
78     [db__temp__dir => q"./wikidata/lock/"],
79     [namazu__index_dir => q"/var/namazu/index/suikawiki"],
80     ) {
81     ## On system that does not set current directory as main script
82     ## directory, you should specify it instead of using "abs_path".
83     $WIKI->{config}->{path_to}->{$_->[0]} = abs_path $_->[1];
84     }
85    
86     ## -- Namazu URI Mapping (See SuikaWiki:SuikaWiki//Namazu) --
87     $WIKI->{config}->{nmz__uri_to_uri} = sub {
88     my ($nmzuri, %opt) = @_;
89     if ($nmzuri =~ s!^\Q$opt{o}->{wiki}->{config}->{path_to}->{db__content__dir}\E/*!!o) {
90     $nmzuri =~ s/\.txt$//;
91     return $opt{o}->{wiki}->uri_reference
92     (page => $opt{o}->{wiki}->name ([
93     map {s/([0-9A-F][0-9A-F])/pack 'C', hex $1/ge; $_}
94     split m!\.ns/!, $nmzuri
95     ]), base => 1);
96     } else {
97     $nmzuri =~ s<^/home/wakaba/public_html/([^.]+)><http://suika.fam.cx/~wakaba/$1>;
98     return ($nmzuri, $nmzuri);
99     }
100     };
101    
102     ## -- WikiPlugin
103     push @{$WIKI->{event}->{plugin_manager_loaded}}, sub {
104     my $wiki = shift;
105    
106     ## Installed plugin modules
107     $wiki->{plugin}->load_directory (qw(
108     lib/SuikaWiki/Plugin/
109     misc/plugins/
110     misc/plugins/form/
111     misc/plugins/format/
112     misc/plugins/link/
113     misc/plugins/view/
114     ));
115    
116     ## Configuration file as pseudo-plugin module
117     require 'wikidata/config.ph';
118     };
119    
120     ## -- WikiDatabase: Mapping logical to physical
121     push @{$WIKI->{event}->{database_loaded}}, sub {
122     my $wiki = shift;
123    
124     ## Main content
125     $wiki->{db}->_set_prop_db (content => {-db_open => sub {
126 wakaba 1.14 require SuikaWiki::DB::FileSystem::LeafFile;
127     SuikaWiki::DB::FileSystem::LeafFile->new
128     (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
129     directory_suffix => '.ns',
130     file_suffix => '.txt',
131     root_key => $wiki->{config}->{page}->{Default},
132 wakaba 1.15 -lock => $wiki->{var}->{db}->{lock_prop}->('content_prop'));
133     }, -db_close => sub {
134     my %opt = @_;
135     $opt{prop_info}->{-db}->close;
136     delete $opt{prop_info}->{-db};
137     }});
138    
139     ## Properties
140     $wiki->{db}->_set_prop_db (content_prop => {-db_open => sub {
141     require SuikaWiki::DB::FileSystem::LeafProp;
142     SuikaWiki::DB::FileSystem::LeafProp->new
143     (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
144     directory_suffix => '.ns',
145     file_suffix => '.prop',
146     root_key => $wiki->{config}->{page}->{Default},
147 wakaba 1.13 -lock => $wiki->{var}->{db}->{lock_prop}->('content'));
148     }, -db_close => sub {
149     my %opt = @_;
150     $opt{prop_info}->{-db}->close;
151     delete $opt{prop_info}->{-db};
152     }});
153    
154     ## Last modified
155     $wiki->{db}->_set_prop_db (lastmodified => {-db_open => sub {
156     require SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09;
157     SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09->new
158     (directory => $wiki->{config}->{path_to}->{db__content__dir},
159     -lock => $wiki->{var}->{db}->{lock_prop}->('lastmodified'));
160     }, -prop => 'last_modified', -db_close => sub {
161     my %opt = @_;
162     $opt{prop_info}->{-db}->close;
163     delete $opt{prop_info}->{-db};
164     }});
165    
166     ## Cache DBs
167     require SuikaWiki::DB::FileSystem::SuikaWikiCache09;
168     my $cachedb = SuikaWiki::DB::FileSystem::SuikaWikiCache09->new
169     (directory => $wiki->{config}->{path_to}->{db__cache__dir},
170     expires => 86400 * 3, removes => 86400 * 3); # 3 days
171     $wiki->{db}->_set_prop_db (m__search_result =>
172     {-db => $cachedb, -prop => 'search_result', -db_close => sub {
173     my %opt = @_;
174     $opt{prop_info}->{-db}->close;
175     delete $opt{prop_info}->{-db};
176     }});
177     $wiki->{db}->_set_prop_db (wpp__headsummary =>
178     {-db => $cachedb, -prop => 'headsummary', -db_close => sub {
179     my %opt = @_;
180     $opt{prop_info}->{-db}->close;
181     delete $opt{prop_info}->{-db};
182     }});
183     $wiki->{db}->_set_prop_db (ref__item_template =>
184     {-db => $cachedb, -prop => 'refereritem', -db_close => sub {
185     my %opt = @_;
186     $opt{prop_info}->{-db}->close;
187     delete $opt{prop_info}->{-db};
188     }});
189    
190     ## Berkely DB Environment Preparation
191     use BerkeleyDB;
192     my $bdbenv = new BerkeleyDB::Env
193     -Home => $wiki->{config}->{path_to}->{db__bdb__home_dir},
194     -Config => {
195     DB_DATA_DIR => $wiki->{config}->{path_to}->{db__content__dir},
196     DB_LOG_DIR => $wiki->{config}->{path_to}->{db__bdb__log_dir},
197     DB_TMP_DIR => $wiki->{config}->{path_to}->{db__bdb__temp_dir},
198     },
199     -ErrFile => $wiki->{config}->{path_to}->{db__bdb__log_file},
200     -Flags => DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL,
201     -Verbose => $wiki->{config}->{debug}->{db};
202    
203     $wiki->{db}->_set_prop_db (content__structured => {-db_open => sub {
204     require SuikaWiki::DB::Hash;
205     new SuikaWiki::DB::Hash constructor => sub {
206     use MLDBM qw(BerkeleyDB::Hash);# Storable);
207     tie my %mldb, 'MLDBM',
208     -Filename => $wiki->{config}->{path_to}
209     ->{db__cache_struct__file},
210     -Env => $bdbenv,
211     -Flags => DB_CREATE,
212     -Mode => 0644;
213     \%mldb;
214     };
215     }});
216    
217     ## Referer Database (See Referer plugin module)
218     $wiki->{db}->_set_prop_db (referer => {-db_open => sub {
219 wakaba 1.14 require SuikaWiki::DB::FileSystem::Count;
220     SuikaWiki::DB::FileSystem::Count->new
221     (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
222     directory_suffix => '.ns',
223     file_suffix => '.ref',
224     root_key => $wiki->{config}->{page}->{Default},
225     auto_mkdir => 0,
226     -lock => $wiki->{var}->{db}->{lock_prop}->('referer'));
227     }, -db_close => sub {
228     my %opt = @_;
229     $opt{prop_info}->{-db}->close;
230     delete $opt{prop_info}->{-db};
231 wakaba 1.13 }});
232    
233     ## HTTP Request Logging Database (See RequestLog plugin module)
234     $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub {
235     require SuikaWiki::DB::Hash;
236     new SuikaWiki::DB::Hash constructor => sub {
237     tie my %db, 'BerkeleyDB::Hash',
238     -Filename => 'http-request-log.db',
239     -Env => $bdbenv,
240     -Flags => DB_CREATE,
241     -Mode => 0644;
242     \%db;
243     };
244     }});
245    
246     ## Additional WikiDB properties should be defined here
247     # ...
248     };
249    
250     push @{$WIKI->{event}->{input_close}}, sub {
251     my ($wiki, $event) = @_;
252     try {
253     SuikaWiki::Plugin->module_package ('Referer')
254     ->add_referer (wiki => $wiki,
255     uri => $wiki->{input}->meta_variable
256     ('HTTP_REFERER'));
257     } catch SuikaWiki::Plugin::error with {
258     my $err = shift;
259     $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
260     };
261     try {
262     SuikaWiki::Plugin->module_package ('RequestLog')
263     ->http_request_log (wiki => $wiki,
264     prop => 'log__http_request');
265     } catch SuikaWiki::Plugin::error with {
266     my $err = shift;
267     $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
268     };
269     };
270    
271     ## -- WikiName of special purpose WikiPages
272     $WIKI->{config}->{page} = {
273     Default => $WIKI->name ([qw/HomePage/]),
274     InterWikiName => $WIKI->name ([qw/Wiki InterWikiName/]),
275     NewPageTemplate => $WIKI->name ([qw/Wiki NewPageTemplate/]),
276     'StyleSheetList(text/html)' => $WIKI->name ([qw<Wiki Style List text/html>]),
277     };
278    
279     ## -- WikiNamespace constants
280     $WIKI->{config}->{name}->{space} = {
281     separator => '//',
282     separator_reg => qr#\s*//\s*#,
283     self => '.',
284     parent => '..',
285     root => '//',
286     };
287    
288     ## -- Default character codes
289     $WIKI->{config}->{charset} = {
290     ## Internal code - MUST be ASCII + 8bit coding scheme
291     internal => 'euc-jp',
292     ## Default output code
293     output => 'iso-2022-jp',
294     ## "query" part in URI reference
295     uri_query => '', # auto-detected
296     uri_query_encode => 'euc-jp', ## For compatibility w/ SuikaWiki 2
297     uri_param => '', # auto-detected
298     uri_param_encode => 'euc-jp', ## For compatibility w/ SuikaWiki 2
299     ## PATH_INFO part in URI reference
300     uri_path_info => 'x-utf-8-10646', ## Reserved for future use
301     ## Fragment identifier in URI reference
302     uri_fragment => 'x-punycode', ## Reserved for possible future use
303     };
304 wakaba 1.15
305     ## -- User option for media types
306     $WIKI->{config}->{ExpandedURI q<media-type:accept-media-type>} = {
307     q<IMT:text/css##> => 1,
308     q<IMT:text/plain##> => 1,
309     q<IMT:text/x-suikawiki;version="0.9"##> => 1,
310     q<IMT:application/x.suikawiki.config;version="2.0"##> => 1,
311     };
312 wakaba 1.13
313     ## -- Expires duration templates
314     $WIKI->{config}->{entity}->{expires} = {
315     edit => {delta => 60},
316     view => {delta => 2*3600},
317     list => {delta => 60},
318     lm_flaged => {delta => 30*24*3600},
319     stylesheet => {delta => 30*24*3600},
320     error => {delta => 60},
321     };
322    
323     ## -- Debug mode
324     $WIKI->{config}->{debug} = {
325     general => 0,
326     db => 0,
327     format => 0,
328     view => 0,
329     };
330 wakaba 1.11
331 wakaba 1.8 };
332 w 1.1
333 wakaba 1.13 =head1 SEE ALSO
334 wakaba 1.6
335 wakaba 1.13 C<lib/suikawiki.pl>, C<wiki.cgi>,
336     <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>,
337     <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SWHCS>
338 wakaba 1.6
339     =head1 LICENSE
340    
341 wakaba 1.13 Copyright 2003-2004 Wakaba <w@suika.fam.cx>. All rights reserved.
342 wakaba 1.6
343     This program is free software; you can redistribute it and/or
344     modify it under the same terms as Perl itself.
345    
346     =cut
347    
348 wakaba 1.15 1; # $Date: 2004/04/22 05:45:14 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24