X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=cgi-auth-flexible.git;a=blobdiff_plain;f=caf.pod;h=a5c8a3e18f3495f0ed1c870e98201df24715fd10;hp=922f7f8c0eb79fefeb56393e0525ffb95cda3ee4;hb=8c6dbdb773712f0774f51c4754e9864641fbea24;hpb=13075e27d727e241343ec8a5bd96ee9d8f6e69f4 diff --git a/caf.pod b/caf.pod index 922f7f8..a5c8a3e 100644 --- a/caf.pod +++ b/caf.pod @@ -1,5 +1,20 @@ # -*- fundamental -*- +# This is part of CGI::Auth::Flexible, a perl CGI authentication module. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version, with the "CAF Login Exception" +# as published by Ian Jackson (version 1, or at your option any +# later version) as an Additional Permission. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + + =head1 NAME CGI::Auth::Flexible - web authentication optionally using cookies @@ -7,7 +22,7 @@ CGI::Auth::Flexible - web authentication optionally using cookies =head1 SYNOPSYS my $verifier = CGI::Auth::Flexible->new_verifier(setting => value,...); - my $authreq = $verifier->new_request($cgi_query_object); + my $authreq = $verifier->new_request($cgi); # simple applications $authreq->check_ok() or return; @@ -68,7 +83,13 @@ honour the return value. =item * If you're using C, implement either the -C or C hook. +C or C hook and provide it as +a setting to C. + +=item * + +Provide the setting C (or provide absolute paths for all the +other relevant settings). =item * @@ -96,6 +117,11 @@ B: If you do not override the source provision facility (see L), check that the assumptions it makes aren't going to leak security-critical data. +=item * + +Set up HTTPS on your webserver, or set the C setting +to a false value. + =back These points will now be covered in more detail. @@ -109,7 +135,9 @@ This call can be expensive and is best amortised. The resulting verifier object can be used to process individual requests, in each case with -C<< $authreq = CGI::Auth::Flexible->new_request($cgi_query) >>. +C<< $authreq = CGI::Auth::Flexible->new_request($cgi) >>. + +See L. =head2 CHECKING AND RESPONSE GENERATION @@ -120,10 +148,10 @@ interfaces for this: =head3 Simple applications -The simplist usage is to call C<< $request->check_ok() >> which will +The simplest usage is to call C<< $request->check_ok() >> which will check the user's authentication. If the user is not logged in it will generate a login form (or redirection or other appropriate page) and -return false; your application should not then processing that request +return false; your application should not then process that request any further. If the user is logged in it will return true. Various hooks are provided to customise the responses generated by @@ -132,31 +160,35 @@ C. After C returns true you should go ahead and process the request; you can use C<< $request->get_username >> to find out which user the request came from. +You may also need to call C and/or C +- see below. -=head2 Sophisticated applications +=head3 Sophisticated applications If you want to handle the control flow and to generate login forms, redirections, etc., yourself, you can say C<< $divert = $request->check_divert >>. This returns undef if -the user is logged in, or I if some kind of login -page or diversion should be generated. - -xxx see below +the user is logged in, or a I if some kind of login +page or diversion should be generated. See L below for +details of how to deal with the return value. =head2 MUTATING OPERATIONS AND EXTERNAL LINKS =head3 Mutation-ignorant applications -By default CGI::Auth::Flexible does not permit external links into -your site. All GET requests give a "click to continue" page which +By default CGI::Auth::Flexible does not permit external deep links +into your site. +All GET requests give a "click to continue" page which submits a form which loads your app's main page. In this configuration all your application's forms and AJAX requests should -use C. This restriction arises from complicated deficiencies -in the web's security architecture. +use C. Such applications are also not able to provide user-specific CSS stylesheets, javascript, favicons, etc. +This restriction arises from complicated deficiencies +in the web's security architecture. + =head3 Mutation-aware applications The alternative is for your application to always make a special check @@ -186,7 +218,7 @@ include a secret hidden form parameter for the benefit of CGI::Auth::Generic. This form parameter will be checked by C/C and should be ignored by your application. -By default the hidden parameter is called C. +By default the hidden parameter is called C. After calling C or C the value to put in your form can be obtained from C; C @@ -233,6 +265,12 @@ will die, stopping the attack. (You do not need to call C for POST requests, but it is harmless to do so.) +=head3 Mutation-aware applications - novel kinds of request + +If you want to support a kind of request perhaps not yet known about +by CGI::Auth::Flexible, you can provide information about that new +request kind using C. + =head2 DATA STORAGE CGI::Auth::Flexible needs to store various information in plain files; @@ -313,9 +351,9 @@ Initialises an instance and returns a verifier object. The arguments are setting pairs like a hash initialiser. See L below. -=item C<< $verifier->new_request($cgi_query) >> +=item C<< $verifier->new_request($cgi) >> -Prepares to process a request. I<$cgi_query> should normally +Prepares to process a request. I<$cgi> should normally be the query object from L. Most of the default hook methods assume that it is; however if you replace enough of the hook methods then you can pass any value you like and it @@ -349,12 +387,14 @@ Discards the resources (open files, etc.) in the verifier object. =back -=head REQUEST-HANDLING FUNCTIONS AND METHODS +=head1 REQUEST-RELATED FUNCTIONS AND METHODS All of these are only valid after C or C has been called. (In the case of C it won't normally be sensible to call these functions unless C returned true.) +=over + =item C<< $authreq->get_divert() >> Returns the value previously returned by C. @@ -364,14 +404,50 @@ Returns the value previously returned by C. Returns the name of the logged-in user. If the user was not logged in (or their session had timed out, or something), returns undef. -=head RESPONSE-RELATED FUNCTIONS AND METHODS +=item C<< $authreq->check_mutate() >> + +Declares to CGI::Auth::Generic that the request being handled will +"mutate". That is, it will modify some server-side state (eg, adding +items to shopping baskets, posting messages to blogs, sending emails, +or whatever). + +If you have set the setting C you must call +C whenever appropriate. If you haven't then it's +irrelevant. See L. + +C will either return successfully, indicating that all +is well and the request should proceed, or it will die. If it dies +that means that the request was improper, which can only result from a +bug or an attack. So an "internal server error" is a suitable +response. + +=item C<< $authreq->check_nonpage($method, $reqtype) >> + +Declares to CGI::Auth::Generic that the request is not a page request, +but rather a request of type I<$reqtype>. + +If your application has set the setting C, +whenever it is handling anything except an HTML page loads, it must +call this function. See L, and +L. + +C will either return successfully, indicating that all +is well and the request should proceed, or it will die, like +C. + +=back + +=head1 RESPONSE-RELATED FUNCTIONS AND METHODS + +=over =item C<< $authreq->url_with_query_params($params, [$nonpagetype]) >> Convenience function which returns a url for a GET request to this application. -I<$params> is a hashref specifying the parameters and the PATH_INFO. +I<$params> is a hashref specifying the parameters and the PATH_INFO +(not including any parameters related to CGI::Auth::Flexible). The keys are the parameter names, and the values are array refs with the parameter value(s) (as strings, as yet unquoted). (They are array refs because it is possible to pass multiple values for the same @@ -383,11 +459,965 @@ with name C<< '' >> is supplied, it is taken as the PATH_INFO - its value will be appended to the application path. (It should normally start with C<< / >>, and only one value should be supplied.) -=item C<< $authreq->chain_params() >> +=item C<< something->need_add_hidden($method, $reqtype) >> + +Enquires whether a request of type I<$reqtype> using HTTP method +I<$method> needs the hidden form parameter. See L. + +=item C<< something->secret_hidden_val() >> + +Returns the value of the hidden form parameter. This should be +included in all POST requests to your application (and thus be a +hidden form parameter in all forms). + +It should also be in some (maybe all) GET requests. If your +application is mutation-ignorant, it should be in all GET requests. +If you are mutation-aware, you need to consult C. + +The name of the hidden parameter is the setting C, +C by default. xxx rename param and setting + +=item C<< something->secret_hidden_html() >> + +Returns the HTML for an C element specifying the hidden form +parameter. + +=item C<< something->secret_cookie_val() >> + +Returns the value of the secret cookie. CGI::Auth::Flexible sets this +cookie in the forms generated by C. You may also set it +yourself (and indeed you must do so if you use C). + +=item C<< $authreq->_chain_params() >> Returns a hash of the "relevant" parameters to this request, in a form -used by XXX. This is all of the query parameters which are not -related to CGI::Auth::Flexible. The PATH_INFO from the request is -returned as the parameter C<< '' >>. +suitable for C. This is all of the query +parameters which are not related to CGI::Auth::Flexible. The +PATH_INFO from the request is returned as the parameter C<< '' >>. + +=back + +=head1 OTHER FUNCTIONS AND METHODS + +=over + +=item C<< $verifier_or_authreq->hash($data) >> + +Hashes the supplied data using the hash function specified by the +C setting, and converts the result to a string of hex +digits. + +=item C<< something->update_get_need_add_hidden($reqtype, $value, [$force]) >> + +Updates CGI::Auth::Generic's knowledge about the various kinds of +request, and whether they need the hidden form parameter. This +function applies only to GET requests - POST requests always use the +parameter. + +I<$reqtype> is the request type (the value which will be passed to +C and C. If you are supporting a new +I<$reqtype> you shouuld coordinate with CGI::Auth::Flexible upstream, +or other users, to assign a unique request type name. + +This method may be called on an authreq or a verifier, in which case +it will affect all authreqs using the same verifier. Or it may be +called on the class as a whole, in which case it will affect the +global default list for all verifiers. + +If I<$force> is supplied and true, this will override +CGI::Auth::Flexible's existing knowledge. Otherwise this new setting +will be ignored if CGI::Auth::Flexible already knows about the request +type. (When called on a verifier or authreq, it will ignore the +update in favour of existing knowledge recorded both globally in the +class or due to previous requests on the same verifier.) + +See L. + +=item C<< CGI::Auth::Flexible::srcdump_dir_cpio($cgi,$verifier,$dumpdir,$dir,$outfn,$how,$script) >> + +Helper function for implementing the C hook. +Generates a tarball using cpio and includes it in the prepared source +code distribution. + +The arguments are mostly the same as for that hook. C<$dir> is the +root directory at which to start the archive. C<$how> is a short text +string which will be mentioned in the log. + +C<$script> is a shell script fragment which must output a +nul-separated list of filenames (e.g. the output of C). +It is textually surrounded by C<( )> and will be executed with C +in force. Its cwd will be C<$dir>. + +=item C<< $verifier_or_authreq->($data) | CGI::Auth::Flexible-> >> + +Hashes the supplied data using the hash function specified by the +C setting, and converts the result to a string of hex +digits. + +=back + +=head1 REQUEST TYPES + +The C<$reqtype> values understood by C are strings. +They are: + +=over + +=item C + +A top-level HTML page load. May contain confidential information for +the benefit of the logged-in user. + +=item C + +An HTML frame. May contain confidential information for +the benefit of the logged-in user. + +=item C