5 CGI::Auth::Flexible - web authentication optionally using cookies
9 my $verifier = CGI::Auth::Flexible->new_verifier(setting => value,...);
10 my $authreq = $verifier->new_request($cgi);
13 $authreq->check_ok() or return;
15 # sophisticated applications
16 my $divert_kind = $authreq->check_divert();
17 if ($divert_kind) { ... print diversion page and quit ... }
19 # while handling the request
20 $user = $authreq->get_username();
21 $authreq->check_mutate();
25 CGI::Auth::Flexible is a library which you can use to add a
26 forms/cookie-based login facility to a Perl web application.
28 CGI::Auth::Flexible doesn't interfere with your application's URL path
29 namespace and just needs a few (configurable) form parameter and
30 cookie name(s) for its own use. It tries to avoid making assumptions
31 about the implementation structure of your application.
33 Because CGI::Auth::Flexible is licenced under the AGPLv3, you will
34 probably need to provide a facility to allow users (even ones not
35 logged in) to download the source code for your web app. Conveniently
36 by default CGI::Auth::Flexible provides (for pure Perl webapps) a
37 mechanism for users to get the source.
39 CGI::Auth::Flexible is designed to try to stop you accidentally
40 granting access by misunderstanding the API. (Also it, of course,
41 guards against cross-site scripting.) You do need to make sure to
42 call CGI::Auth::Flexible before answering AJAX requests as well as
43 before generating HTML pages, of course, and to call it in every
44 entrypoint to your system.
48 As a minimum you need to do all of the things on this checklist, where
49 applicable. The items marked SECURITY are the ones that you might
50 forget: without them your application may appear to work, but will be
57 Call C<new_verifier> (once at application startup)
61 Call C<new_request> (once per request)
65 B<SECURITY>: Call C<check_ok> or C<check_divert> on every request, and
66 honour the return value.
70 If you're using C<check_ok>, implement either the
71 C<username_password_error> or C<login_ok> hook and provide it as
72 a setting to C<new_verifier>.
76 Provide the setting C<dir> (or provide absolute paths for all the
77 other relevant settings).
81 Call C<get_username> when you need to know who's logged in.
85 B<SECURITY>: Call C<check_mutate> or C<mutate_ok>, if you specified
86 C<promise_check_mutate>.
90 B<SECURITY>: Call C<check_nonpage> for every request which is not a page load
91 (if your application has any of those).
95 When generating URLs and forms (including AJAX requests), include the
96 hidden form parameter using C<secret_hidden_val> or
97 C<secret_hidden_html> when appropriate (see below).
101 B<SECURITY>: If you do not override the source provision facility (see
102 L</SOURCE CODE DOWNLOAD>), check that the assumptions it makes aren't
103 going to leak security-critical data.
107 Set up HTTPS on your webserver, or set the C<encrypted_only> setting
112 These points will now be covered in more detail.
114 =head2 INITIALISATION
116 Your application should, on startup (eg, when it is loaded by
118 C<< $verifier = CGI::Auth::Flexible->new_verifier(settings...) >>.
119 This call can be expensive and is best amortised.
121 The resulting verifier object can be used to process individual
122 requests, in each case with
123 C<< $authreq = CGI::Auth::Flexible->new_request($cgi) >>.
127 =head2 CHECKING AND RESPONSE GENERATION
129 If the user is logged in, your application is to handle the request.
130 Otherwise, the user needs to be presented with a login form or error
131 message, as appropriate. CGI::Auth::Flexible provides two alternative
134 =head3 Simple applications
136 The simplist usage is to call C<< $request->check_ok() >> which will
137 check the user's authentication. If the user is not logged in it will
138 generate a login form (or redirection or other appropriate page) and
139 return false; your application should not then processing that request
140 any further. If the user is logged in it will return true.
142 Various hooks are provided to customise the responses generated by
145 After C<check_ok> returns true you should go ahead and process the
146 request; you can use C<< $request->get_username >> to find out which
147 user the request came from.
149 =head2 Sophisticated applications
151 If you want to handle the control flow and to generate login forms,
152 redirections, etc., yourself, you can say
153 C<< $divert = $request->check_divert >>. This returns undef if
154 the user is logged in, or I<divert spec> if some kind of login
155 page or diversion should be generated. See L</DIVERT SPEC> below for
156 details of how to deal with the return value.
158 =head2 MUTATING OPERATIONS AND EXTERNAL LINKS
160 =head3 Mutation-ignorant applications
162 By default CGI::Auth::Flexible does not permit external links into
163 your site. All GET requests give a "click to continue" page which
164 submits a form which loads your app's main page. In this
165 configuration all your application's forms and AJAX requests should
166 use C<POST>. This restriction arises from complicated deficiencies
167 in the web's security architecture.
169 Such applications are also not able to provide user-specific CSS
170 stylesheets, javascript, favicons, etc.
172 =head3 Mutation-aware applications
174 The alternative is for your application to always make a special check
175 when the incoming request is going to do some kind of action (such as
176 modifying the user's setup, purchasing goods, or whatever) rather than
177 just retrieve and/or display information. We term such requests
180 Then non-mutating pages can be linked to from other, untrustworthy,
183 To support external links, and C<GET> requests, pass
184 C<< promise_check_mutate => 1 >> in I<settings>, and then call
185 C<< $authreq->check_mutate() >> before taking any actions. If the
186 incoming request is not suitable then C<< $authreq->check_mutate() >>
189 There have to be no mutating C<GET> requests in your application (but
190 you shouldn't have any of those anyway); if there are, they won't
191 work. (CGI::Auth::Flexible will spot them and cause them to fail,
192 rather than allow them to be insecure.)
194 =head2 GENERATING URLS, FORMS AND AJAX QUERIES
196 When you generate a URL, C<POST> form or AJAX request you may need to
197 include a secret hidden form parameter for the benefit of
198 CGI::Auth::Generic. This form parameter will be checked by
199 C<check_ok>/C<check_divert> and should be ignored by your application.
201 By default the hidden parameter is called C<caf_assochash>.
203 After calling C<check_ok> or C<check_divert> the value to put in your
204 form can be obtained from C<secret_hidden_val>; C<secret_hidden_html>
205 will generate the whole HTML C<< <input...> >> element.
207 =head3 Mutation-ignorant applications
209 For mutation-ignorant applications (see above), all forms etc. should
210 include the hidden parameter (and as discussed, they must all use
211 POST rather than GET).
213 =head3 Mutation-aware applications
215 For mutation-aware applications, whether to include the secret
216 parameter depends on the kind of request. CGI::Auth::Flexible knows
217 when it is necessary. You should find out by calling
220 If it is inconvenient to call C<need_add_hidden> at runtime, you can
221 rely instead on the following promises: All POST requests (which
222 includes all mutating requests) need the parameter. The return value
223 of need_add_hidden depends only on the $method and $reqtype
224 parameters, so you can query it once and remember the answer.
225 HTML page load GETs do not need the parameter. It is better to
226 err on the side of including the parameter.
228 If you really must, you can call C<need_add_hidden> "on the bench"
229 during development and bake the answer into your application code
230 structure. However, if you do that and a new vulnerability was
231 discovered which is fixed by changing the answer, updating
232 CGI::Auth::Flexible wouldn't be sufficient to fix it.
234 =head3 Mutation-aware applications - non-page requests
236 If your mutation-aware application supports non-page resources (AJAX
237 and JSON requests, stylesheets, favicons, etc.) it must inform
238 CGI::Auth::Flexible when it is handling such a request, by calling
241 Normally C<check_nonpage> will simply return (and you can ignore the
242 return value). However, if there is an attack (or, perhaps, a bug) it
243 will die, stopping the attack.
245 (You do not need to call C<check_nonpage> for POST requests, but it is
248 =head3 Mutation-aware applications - novel kinds of request
250 If you want to support a kind of request perhaps not yet known about
251 by CGI::Auth::Flexible, you can provide information about that new
252 request kind using C<update_get_need_add_hidden>.
256 CGI::Auth::Flexible needs to store various information in plain files;
257 it does this in the directory specified by the C<dir> parameter.
259 =head1 SOURCE CODE DOWNLOAD
261 By default, CGI::Auth::Flexible provides a facility for users to
262 download the source code for the running version of your web
265 This facility makes a number of important assumptions which you need
266 to check. Note that if the provided facility is not sufficient
267 because your application is more sophisticated than it copes with (or
268 if you disable the builtin facility), you may need to implement a
269 functioning alternative to avoid violating the AGPLv3 licence.
271 Here are the most important (default) assumptions:
277 Your app's source code is available by looking at @INC, $0 and
278 S<$ENV{'SCRIPT_FILENAME'}> (the B<source items>). See
279 C<srcdump_listitems>. Where these point to files or directories under
280 revision control, the source item is the whole containing vcs tree.
284 Specifically, there are no compiled or autogenerated Perl
285 files, Javascript resources, etc., which are not contained in one of
286 the source item directories. (Files which came with your operating
287 system install don't need to be shipped as they fall under the system
292 You have not installed any modified versions of system
293 libraries (including system-supplied Perl modules) in C</usr> outside
294 C</usr/local>. See C<srcdump_system_dir>.
298 For each source item in a dvcs, the entire dvcs history does
299 not contain anything confidential (or libellous). Also, all files which
300 contain secrets are in the dvcs's I<.ignore> file. See
301 C<srcdump_vcsscript_git> et al.
305 For each source item NOT in a dvcs, there are no confidential
306 files with the world-readable bit set (being in a world-inaccessible
307 directory is not sufficient). See C<srcdump_excludes>.
311 You have none of your app's source code in C</etc>.
315 You don't regard pathnames on your server as secret.
319 You don't intentionally load Perl code by virtue of C<.>
320 being in C<@INC> by default. (See C<srcdump_filter_cwd>.)
324 =head1 MAIN FUNCTIONS AND METHODS
328 =item C<< CGI::Auth::Flexible->new_verifier(setting => value, ...) >>
330 Initialises an instance and returns a verifier object.
331 The arguments are setting pairs like a hash initialiser.
332 See L</SETTINGS> below.
334 =item C<< $verifier->new_request($cgi) >>
336 Prepares to process a request. I<$cgi> should normally
337 be the query object from L<CGI(3perl)>. Most of the default
338 hook methods assume that it is; however if you replace enough of
339 the hook methods then you can pass any value you like and it
340 will be passed to your hooks.
342 The return value is the authentication request object (I<$authreq>)
343 which is used to check the incoming request and will contain
344 information about its credentials.
346 =item C<< $authreq->check_divert() >>
348 Checks whether the user is logged in. Returns undef if the user is
349 logged in and we should service the request. Otherwise returns a
350 divert spec (see L</DIVERT SPEC>) saying what should happen instead.
352 This method may die if it doesn't like the request, in which case
353 the request needs to be rejected.
355 =item C<< $authreq->check_ok() >>
357 Checks whether the user is logged in. Returns true if the user is
358 logged in and we should service the request.
360 Otherwise it handles the request itself, generating any appropriate
361 redirect, login form, or continuation page. It then returns false and
362 the application should not process the request further.
364 =item C<< $verifier->disconnect() >>
366 Discards the resources (open files, etc.) in the verifier object.
370 =head REQUEST-RELATED FUNCTIONS AND METHODS
372 All of these are only valid after C<check_divert> or C<check_ok> has
373 been called. (In the case of C<check_ok> it won't normally be sensible
374 to call these functions unless C<check_ok> returned true.)
376 =item C<< $authreq->get_divert() >>
378 Returns the value previously returned by C<check_divert>.
380 =item C<< $authreq->get_username() >>
382 Returns the name of the logged-in user. If the user was not logged
383 in (or their session had timed out, or something), returns undef.
385 =item C<< $authreq->check_mutate() >>
387 Declares to CGI::Auth::Generic that the request being handled will
388 "mutate". That is, it will modify some server-side state (eg, adding
389 items to shopping baskets, posting messages to blogs, sending emails,
392 If you have set the setting C<promise_check_mutate> you must call
393 C<check_mutate> whenever appropriate. If you haven't then it's
394 irrelevant. See L<MUTATING OPERATIONS AND EXTERNAL LINKS>.
396 C<check_mutate> will either return successfully, indicating that all
397 is well and the request should proceed, or it will die. If it dies
398 that means that the request was improper, which can only result from a
399 bug or an attack. So an "internal server error" is a suitable
402 =item C<< $authreq->check_nonpage($method, $reqtype) >>
404 Declares to CGI::Auth::Generic that the request is not a page request,
405 but rather a request of type I<$reqtype>.
407 If your application has set the setting C<promise_check_mutate>,
408 whenever it is handling anything except an HTML page loads, it must
409 call this function. See L</REQUEST TYPES>, and
410 L<GENERATING URLS, FORMS AND AJAX QUERIES>.
412 C<check_mutate> will either return successfully, indicating that all
413 is well and the request should proceed, or it will die, like
416 =head RESPONSE-RELATED FUNCTIONS AND METHODS
418 =item C<< $authreq->url_with_query_params($params, [$nonpagetype]) >>
420 Convenience function which returns a url for a GET request to this
423 I<$params> is a hashref specifying the parameters and the PATH_INFO.
424 The keys are the parameter names, and the values are array refs with
425 the parameter value(s) (as strings, as yet unquoted). (They are array
426 refs because it is possible to pass multiple values for the same
427 parameter in a single request; normally each arrayref would be a
430 The request path will be the path to the application. If a parameter
431 with name C<< '' >> is supplied, it is taken as the PATH_INFO - its
432 value will be appended to the application path. (It should normally
433 start with C<< / >>, and only one value should be supplied.)
435 =item C<< something->need_add_hidden($method, $reqtype) >>
437 Enquires whether a request of type I<$reqtype> using HTTP method
438 I<$method> needs the hidden form parameter. See L</REQUEST TYPES>.
440 =item C<< something->secret_hidden_val() >>
442 Returns the value of the hidden form parameter. This should be
443 included in all POST requests to your application (and thus be a
444 hidden form parameter in all forms).
446 It should also be in some (maybe all) GET requests. If your
447 application is mutation-ignorant, it should be in all GET requests.
448 If you are mutation-aware, you need to consult C<need_add_hidden>.
450 The name of the hidden parameter is the setting C<assoc_param_name>,
451 C<caf_hassochash> by default. xxx rename param and setting
453 =item C<< something->secret_hidden_html() >>
455 Returns the HTML for an C<INPUT> element specifying the hidden form
458 =item C<< something->secret_cookie_val() >>
460 Returns the value of the secret cookie. CGI::Auth::Flexible sets this
461 cookie in the forms generated by C<check_ok>. You may also set it
462 yourself (and indeed you must do so if you use C<check_divert>).
466 =head OTHER FUNCTIONS AND METHODS
470 =item C<< $verifier_or_authreq->hash($data) >>
472 Hashes the supplied data using the hash function specified by the
473 C<hash_algorithm> setting, and converts the result to a string of hex
476 =item C<< something->update_get_need_add_hidden($reqtype, $value, [$force]) >>
478 Updates CGI::Auth::Generic's knowledge about the various kinds of
479 request, and whether they need the hidden form parameter. This
480 function applies only to GET requests - POST requests always use the
483 I<$reqtype> is the request type (the value which will be passed to
484 C<check_nonpage> and C<need_add_hidden>. If you are supporting a new
485 I<$reqtype> you shouuld coordinate with CGI::Auth::Flexible upstrea,
486 or other users, to assign a unique request type name.
488 This method may be called on an authreq or a verifier, in which case
489 it will affect all authreqs using the same verifier. Or it may be
490 called on the class as a whole, in which case it will affect the
491 global default list for all verifiers.
493 If I<$force> is supplied and true, this will override
494 CGI::Auth::Flexible's existing knowledge. Otherwise this new setting
495 will be ignored if CGI::Auth::Flexible already knows about the request
496 type. (When called on a verifier or authreq, it will ignore the
497 update in favour of existing knowledge recorded both globally in the
498 class or due to previous requests on the same verifier.)
500 See L</REQUEST TYPES>.
502 =item C<< CGI::Auth::Flexible::srcdump_dir_cpio($cgi,$verifier,$dumpdir,$dir,$outfn,$how,$script) >>
504 Helper function for implementing the C<srcdump_process_item> hook.
505 Generates a tarball using cpio and includes it in the prepared source
508 The arguments are mostly the same as for that hook. C<$dir> is the
509 root directory at which to start the archive. C<$how> is a short text
510 string which will be mentioned in the log.
512 C<$script> is a shell script fragment which must output a
513 nul-separated list of filenames (e.g. the output of C<find -print0>).
514 It is textually surrounded by C<( )> and will be executed with C<set -e>
515 in force. Its cwd will be C<$dir>.
517 =item C<< $verifier_or_authreq->($data) | CGI::Auth::Flexible-> >>
519 Hashes the supplied data using the hash function specified by the
520 C<hash_algorithm> setting, and converts the result to a string of hex
527 C<new_verifier> and C<new_request> each take a list of settings, as
528 a list of pairs C<< key => value >> (like a Perl hash assignment).
530 The settings supplied to C<new_verifier> are stored in the verifier
531 and will apply to all authreqs made from it unless overridden in the
532 call to C<new_request>
534 When a setting is described as a hook function, it should be a
535 coderef. The first argument will be the query object from
536 L<CGI(3perl)> (strictly, it will be whatever value was passed to
537 C<new_request>). The second argument will be the authreq object (the
538 return value from C<new_request>).
539 Ie, C<< sub some_hook ($$...) { my ($cgi,$authreq,@stuff) = @_ ... >>
541 In bullet point headings, the hook functions are shown in the form
542 C<< some_hook($cgi,$authreq,@stuff) >> even though this would not be
543 legal syntax. This should be read to mean that the
544 %implicit_settings_hash{'some_hook'}($cgi,$authreq,@stuff)
545 would be a legal call. (However, the settings hash is not exposed.)
547 When a hook's default implementation is mentioned and named, that
548 function won't also be described in the section on the module's
553 =head2 GENERAL SETTINGS
557 The directory CGI::Auth::Generic should use for its data storage.
558 This is actually just a default absolute path used when the other
559 path settings are relative values.
561 Must be an absolute filename.
565 CGI::Auth::Flexible needs a database for recording users' login
566 session. This database needs to be shared across all instances of the
567 web application, so in a multi-node cluster it needs to be your actual
570 CGI::Auth::Flexible will create the table and index it needs if they
571 don't already exist, and will manage their contents. You do not need
572 to integrate them into the rest of your webapp's data storage. (In
573 particular, there is no need for transactional integrity across
574 changes made by CAF and your own application.)
576 By default, CAF uses a sqlite3 database stored on local disk in the
577 file named by C<assocdb_path>. This will be suitable for all
578 applications which run on a single host.
580 This value, if supplied, should be a DBI handle for the database.
584 This is the DSN to pass to C<< DBI->connect >>. Used only if
585 C<assocdb_dbh> is not supplied.
587 =item C<assocdb_path>
589 Path to the sqlite3 database used for CAF's session storage. The
590 default is currently C<caf-assocs.db> but will change in the future.
592 Used only if neither C<assocdb_dbh> or C<assocdb_dsn> are supplied.
594 If this is a relative path, it is in C<dir>.
596 =item C<assocdb_table>
598 Prefix for the SQL tables and indices to use (and to create, if
601 See L</DATABASE TABLES>.
605 Path to the keys file used by CAF. This arrangement will change in
606 the future. See L</BUGS>.
608 =item C<random_source>
610 Special file to read random numbers from. Should return
611 cryptographically secure (pseudo)-random bytes, unpredictable to
612 adversaries (even ones on the same machine).
614 On Linux, there is no device which is properly suitable. This is a
615 bug in Linux. You can use C</dev/random> which can block
616 unnecessarily even though the kernel PRNG has been properly seeded and
617 is fine, or C</dev/urandom> which might return values which attackers
618 can predict if the kernel PRNG has not been properly seeded.
620 The default is C</dev/urandom>.
624 Length of the assoc secret. Defaults to 128.
626 =item C<hash_algorithm>
628 Must be a string suitable for use with C<new Digest>.
629 Defaults to C<SHA-256>.
631 =item C<login_timeout>
633 A user will be logged out this many seconds after they first logged
634 in. Default: 86400 (one day).
636 =item C<login_form_timeout>
638 A login form becomes invalid this many seconds after it has been sent.
639 Default: 3600 seconds (one hour).
641 =item C<key_rollover>
643 The key used for generating assoc secrets is rolled over approximately
644 this often (in seconds). Default: 86400.
646 =item C<assoc_param_name>
648 Name of the hidden form parameter. Default: C<caf_assochash>.
652 Name of the cookie used for login sessions. Default:
655 =item C<password_param_name>
657 Name of the password field in the login form. Default: C<password>.
659 Used by C<login_ok_password> (the default C<login_ok> hook),
660 C<gen_plain_login_form> and the default C<is_login> hook.
662 =item C<username_param_names>
664 Arrayref of name(s) of username form parameters.
666 The first entry is used by C<login_ok_password> (the default
667 C<login_ok> hook) to pass to the C<username_password_error> hook and
668 used as the username if all is well.
670 All the entries are used by C<gen_plain_login_fork> (the default
671 C<gen_login_form> hook for C<check_ok>) to generate form entry fields.
673 The default is C<['username']>.
675 =item C<logout_param_names>
677 Arrayref of name(s) of form parameters indicating that the request is
680 Used by the default C<is_logout> hook.
682 If you want users to be able to explicitly log out, you need to
683 provide a logout button, something like
684 C<< <input type="submit" name="caf_logout" ...>>
686 The default is C<['caf_logout']>
688 =item C<logged_param_names>
690 Arrayref of name(s) of form parameters indicating that user has just
691 logged out. (During the logout process, the actual logout action is a
692 POST request, whose response redirects to the "you have been logged
693 out" page; these form parameters are for this second page.)
695 Used by the default C<is_loggedout> hook.
697 The first entry is used by C<check_ok> to generate the redirection.
699 The default is C<['caf_loggedout']>
701 =item C<promise_check_mutate>
703 Boolean. If true, is a declaration by the application that it is
704 mutatin-aware. See L</MUTATING OPERATIONS AND EXTERNAL LINKS>.
708 =item C<encrypted_only>
710 Boolean. If true, CAF will insist that all transactions be done over
711 an encrypted http connection. It will redirect unencrypted requests
712 to the https instance of the applicattion, and will set the encrypted
713 only flag on its cookie.
719 =item C<< get_url($cgi,$authreq) >>
721 Hook which returns the URL of this web application. By default, we
722 call C<< $cgi->url() >> for each request, but you can fix this if you
725 =item C<< is_login,is_logout,is_loggedout($cgi,$authreq) >>
727 Hook which returns a boolean indicating whether the request was,
728 respectively: a login form submission (ie, username and password); a
729 logout request (submission resulting from the user pressing the
730 "logout" button); "logged out" page (redirection from the logout
733 The default is to check whether any of the corresponding request
734 parameters (C<< login_param_names >> etc.) was supplied, using the
739 =head2 SETTINGS (HOOKS) RELATED TO THE CGI REQUEST OBJECT
743 =item C<< get_param($cgi,$authreq,$param) >>
745 Returns the value of a single-valued form parameter.
746 The default is to call C<< $cgi->param($param) >>.
747 The semantics are the same as that of C<CGI::param>.
749 =item C<< get_params($cgi,$authreq) >>
751 Returns a hash of the parameters. The return value is a hashref whose
752 keys are the parameter names and whose values are arrayrefs, one entry
753 in the arrayref for each value.
755 The default is to call C<< $cgi->Vars() >>, expect the
756 results to look like those from C<CGI::Vars>, and massage them into
757 the required form with split.
759 =item C<< get_path_info($cgi,$authreq) >>
761 Returns the PATH_INFO of the request. The default is to
762 call C<< $cgi->path_info() >>.
764 =item C<< get_cookie($cgi,$authreq) >>
766 Returns the value of the CAF cookie sent with the request, or undef if
767 none was supplied. The default is to call C<<
768 $cgi->cookie($cookie_name) >> (where C<$cookie_name> is from the
769 setting of the same name). The return value should be the scalar
772 =item C<< get_method($cgi,$authreq) >>
774 Returns the HTTP method as a string. The default is to call
775 C<< $cgi->request_method() >>.
779 =item C<< is_https($cgi,$authreq) >>
781 Returns a boolean indicating whether the request was over an encrypted
782 channel. The default is C<< !!$cgi->https() >>. See C<encrypted_only>.
786 =head2 SETTINGS RELATED TO HTML GENERATION
788 These are only used if you call C<check_ok> or xxx some other functions?.
790 Settings whose names are of the form C<gen_...> are hooks which each
791 return an array of strings, normally HTML strings, for use by
792 C<check_ok> (or, in turn, other hooks, or your application). These
793 are often documented simply by showing the output produced. In many
794 cases parts of the output are in turn obtained from other hooks. In
795 some cases the default implementations have been given names for
796 convenient use by your application. They will be called in array
799 We'll write C<gettext(something)> even though actually there is a hook
800 to control the translation function used.
804 =item C<handle_divert>($cgi,$authreq,$divert))
806 C<check_ok> calls this hook before producing output of its own. If
807 you want to handle some but not all diversions yourself, you may set
808 this hook. The hook should either do nothing and return false, or
809 return true if it has handled the request (or arrange for the request
810 to be handled). If the hook returns true then C<check_ok> simply
813 =item C<gen_login_form>($cgi,$authreq,$divert))
815 Default: a table (used mostly for layout) containing input fields for
816 a login form. Must be within a C<< <form> >> element, but doesn't
817 generate it. Has text fields for every entry in
818 C<username_param_names> (in each case associated with a description
819 C<< gettext(ucfirst $parameter_name) >>, a password field (with
820 description C<gettext("Password")>, and a login submit button (with
821 description C<gettext("Login")>.
823 Default is available as the module function C<gen_plain_login_form>.
825 =item C<gen_login_link>($cgi,$authreq))
829 <a href="http:...">gettext(Log in again to continue.)</a>
831 Default is available as the module function C<gen_plain_login_link>.
833 =item C<gen_postmainpage_form>($cgi,$authreq,$params))
835 Default: form contents (but not the C<< <form> >> element):
837 C<$params> (in the form returned by the C<get_params> hook) as hidden
840 <input type="submit" ... value=getext('Continue')>
842 Default is available as the module function C<gen_postmainpage_form>.
844 =item C<gen_start_html>($cgi,$authreq,$title)
846 Default: C<$cgi->start_html($title)>
848 =item C<gen_end_html>($cgi,$authreq,$title)
850 Default: C<$cgi->end_html($title)>
852 =item C<gen_footer_html>($cgi,$authreq)>
857 Powered by Free / Libre / Open Source Software
858 according to the [gen_licence_link_html].
859 [gen_source_link_html].
862 Default is available as the module function C<gen_plain_footer_html>.
864 =item C<gen_licence_link_html>($cgi,$authreq)>
866 Default: uses C<url_with_query_params> to generate a URL for
867 downloading the licence, and returns:
868 <a href="...">GNU Affero GPL</a>
870 Default is available as the module function C<gen_plain_licence_link_html>.
872 =item C<gen_source_link_html>($cgi,$authreq)>
874 Default: uses C<url_with_query_params> to generate a URL for
875 downloading the source, and returns:
876 <a href="...">Source available</a>
878 Default is available as the module function C<gen_plain_source_link_html>.
880 =item C<form_entry_size>
882 Size of generated text entry fields. Default is 60.
884 =item C<dummy_param_name_prefix>
886 Some of CAF's HTML-generating functions need to invent form parameter
887 names. They will all start with this string. Default: C<caf__>.
889 =head2 SETTINGS FOR SOURCE CODE DOWNLOAD FACILITY
893 =item C<srcdump_param_name>
895 Form parameter name used to indicate that this is a source download
896 request. If this parameter is supplied, C<check_ok> and
897 C<check_divert> will arrange for the applicaton source code to be
898 delivered as the response (in C<check_ok>'s case by doing it itself
899 and in C<check_divert>'s case by asking your application to do so.
901 Default is C<caf_srcdump>.
903 =item C<srcdump_path>
905 Path to the directory used for storing pre-prepared source downloads.
906 Defaults to C<caf-srcdump>.
908 If this is a relative path, it is in C<dir>.
910 =item C<srcdump_dump($cgi,$authreq,$srcobj)>
912 Dump the source code (C<$srcobj='source'> or licence data
913 (C<$srcobj='licence'>). The default implementation checks that
914 C<$srcobj> has reasonable syntax and uses the files C<$srcobj.data>
915 and C<$srcobj.ctype> with the C<dump> hook.
917 =item C<dump($cgi,$authreq,$contenttype,$datafilehandle)>
919 Responds to the request by sending the contents of $datafilehandle
920 (which should just have been opened) and specifying a content type of
923 The default implmentation uses the C<print> hook, and also calls
924 C<$cgi->header('-type' => $contenttype>, and is available as the
925 module function C<dump_plain>.
927 =item C<srcdump_prepare($cgi,$verifier)>
929 Prepares the source code for download when requested. Invoked by
930 C<new_verifier>, always, immediately before it returns the
931 just-created verifier object.
933 The default implementation is the module function
934 C<srcdump_dirscan_prepare>, which prepares a manifest, licence file
935 and source code tarball of tarballs, as follows:
937 It processes each entry in the return value from C<srcdump_listitems>.
938 These are the software's include directories and any other directories
939 containing source code. It handles C<.> specially (see
940 C<srcdump_filter_cwd>).
942 For each entry it looks, relative to that, for the licence as a file
943 with a name mentioned in C<srcdump_licence_files>. The first such
944 file found is considered to be the licence. It then calls the hook
945 C<srcdump_process_item> for the entry.
947 The licence, a manifest file, and all the outputs generated by the
948 calls to C<srcdump_process_item>, are tarred up and compressed as a
949 single source tarball.
951 It uses the directory named by C<srcdump_path> as its directory for
952 working and output files. It uses the filename patterns
953 C<generate.*>, C<licence.*>, C<s.[a-z][a-z][a-z].*>, C<manifest.*>,
954 C<source.*> in that directory.
956 =item C<srcdump_process_item>($cgi,$verifier,$dumpdir,$item,\&outfn,\$needlicence,\%dirsdone)>
958 Processes a single include directory or software entry, so as to
959 include the source code found there. Called only by the default
960 implementation of C<srcdump_prepare>.
962 C<$dumpdir> is the directory for working and output files. C<$item>
963 is the real (no symlinks) absolute path to the item.
965 C<\$needlicence> is a ref to a scalar: this scalar is undef if we have
966 already found the licence file; otherwise it is the filename to which
967 the licence should be copied. If the referent is undef on entry,
968 C<srcdump_process_item> needs to see if it finds the licence; if it
969 does it should copy it to the named file and then set the scalar to
972 C<\%dirsdone> is a ref to the hash used by C<srcdump_prepare> to avoid
973 including a single directory more than once. If
974 C<srcdump_process_item> decides to process a directory other than
975 C<$item> it should check this hash with the real absolute path of the
976 other directoy as a key: if the hash entry is true, it has already
977 been done and should be skipped; otherwise the hash entry should be set.
979 C<\&outfn> is a coderef which C<srcdump_process_item> should call each
980 time it wants to generate a file which should be included as part of
981 the source code. It should be called using one of these patterns:
982 $outfn->("message for log");
983 $outfile = $outfn->("message for log", "extension");
984 The former simply logs this message (along with the associated
985 C<$item>, so there is no need to mention that). The latter logs the
986 message but also generates and returns a filename which should then
987 be created and filled with some appropriate data. C<"extension">
988 should be a string for the file extension, eg C<"txt">. The output
989 can be written directly to the named file: there is no need to
990 write to a temporary file and rename.
992 The default implementation is the module function
993 C<srcdump_process_item>.
995 It skips directories for which C<srcdump_system_dir> returns true.
997 It then searches the item and its parent
998 directories for a vcs metadata directory (one of the names in
999 C<srcdump_vcs_dirs>); if found, it calls the C<srcdump_byvcs> hook
1000 (after checking and updaeing C<%dirsdone>).
1001 Otherwise it calls the C<srcdump_novcs> hook.
1003 =item C<srcdump_novcs($cgi,$verifier,$dumpdir,$item,$outfn)>
1005 Called by the default implementation of C<srcdump_process_item>, with
1006 the same arguments, if it doesn't find vcs metadata.
1008 The default implementation is the module function C<srcdump_novcs>.
1010 If C<$item> is a directory, it uses C<srcdump_dir_cpio> to prepare a
1011 tarball of all the files under C<$item> which have the world read bit
1012 set. Directories are not included (and their permissions are
1013 disregarded). The contents of C<srcdump_excludes> are excluded.
1015 If it's a plain file it uses C<srcdump_file> to include the file.
1017 =item C<srcdump_byvcs($cgi,$verifier,$dumpdir,$item,$outfn,$vcs)>
1019 Called by the default implementation of C<srcdump_process_item>, with
1020 the same arguments, if it finds vcs metadata. The additional argument
1021 C<$vcs> is derived from the entry of C<srcump_vcs_dirs> which was
1022 used: it's the first sequence of word characters, lowercased.
1024 The default implementation is the module function C<srcdump_byvcs>.
1025 It simply calls C<srcdump_dir_cpio> with a script from the setting
1026 C<srcdump_vcsscript>.
1028 =item C<srcdump_vcs_dirs>
1030 Array ref of leaf names of vcs metadata directories. Used by the
1031 default implementation of C<srcdump_process_item>. The default value
1032 is C<['.git','.hg','.bzr','.svn']>.
1034 =item C<srcdump_vcs_script>
1036 Hash ref of scripts for generating vcs metadata. Used by the default
1037 implementation of C<srcdump_byvcs>. The keys are values of C<$vcs>
1038 (see C<srcdump_byvcs>); the values are scripts as for
1039 C<srcdump_dir_cpio>.
1041 The default has an entry only for C<git>:
1043 git ls-files -z --others --exclude-from=.gitignore
1046 =item C<srcdump_excludes>
1048 Array ref of exclude glob patterns, used by the default implementation
1049 of C<srcdump_novcs>. The default value is C<['*~','*.bak','*.tmp','#*#']>.
1051 Entries must not contain C<'> or C<\>.
1053 =item C<srcdump_listitems($cgi,$verifier)>
1055 Returns an array of directories which might contain source code of the
1056 web application and which should be therefore be considered for
1057 including in the source code delivery.
1059 Used by the default implementation of C<srcdump_prepare>.
1061 Entries must be directories, plain files, or nonexistent; they may
1062 also be symlinks which resolve to one of those.
1064 If C<.> is included it may be treated specially - see
1065 C<srcdump_filter_cwd>.
1067 The default implementation returns
1068 C<(@INC, $ENV{'SCRIPT_FILENAME'}, $0)>.
1070 =item C<srcdump_system_dir($cgi,$verifier,$dir)>
1072 Determines whether C<$dir> is a "system directory", in which any
1073 source code used by the application should nevertheless not be
1074 included in the source code dump.
1076 Used by the default implementation of C<srcdump_item>.
1078 The default implementation is as follows: Things in C</etc/> are
1079 system directories. Things in C</usr/> are too, unless they are in
1080 C</usr/local/> or C</usr/lib/cgi*>.
1082 =item C<srcdump_filter_cwd>
1084 Boolean which controls the handling of C<.> if it appears in the
1085 return value from C<srcdump_listitems>. Used only by the default
1086 implementation of C<srcdump_prepare>.
1088 If set to false, C<.> is treated normally and no special action is
1091 However often the current directory may be C</>, or a data directory,
1092 or some other directory containing data which is confidential, or
1093 should not be included in the public source code distribution for
1094 other reasons. And for historical reasons Perl has C<@INC> containing
1095 C<.> by default (which is arguably dangerous and wrong).
1097 So the default this setting is true, which has the following effects:
1099 C<.> is not searched for source code even if it appears in C<@INC>.
1100 C<.> is removed from C<@INC> and C<%INC> is checked to see if any
1101 modules appear to have already been loaded by virtue of C<.> appearing
1102 in C<@INC> and if they have it is treated as a fatal error.
1104 Only the literal string C<.> is affected. If the cwd is included by
1105 any other name it is not treated specially regardless of this setting.
1109 =head1 DATABASE TABLES
1111 In a simple application, you do not need to worry about this. But if
1112 your application runs on multiple frontend hosts with a shared
1113 database, you may need to create for yourself the tables and indices
1114 used by CGI::Auth::Flexible.
1116 xxx document _db_setup_do
1117 xxx make _db_setup_do explicitly overrideable
1126 xxx bugs wrong default random on Linux
1127 xxx bugs wrong default random on *BSD
1128 xxx bugs keys not shared should be in db
1129 xxx rename caf-assocs.db
1130 xxx rename caf_assocsecret default cookie name
1131 xxx mention relationship between login_timeout and cookies