NAME
       Apache::Roaming - A mod_perl handler for Roaming Profiles

SYNOPSIS
         # Configuration in httpd.conf or srm.conf
         # Assuming DocumentRoot /home/httpd/html

         PerlModule Apache::Roaming
         <Location /roaming>
           PerlHandler Apache::Roaming->handler
           PerlTypeHandler Apache::Roaming->handler_type
           AuthType Basic
           AuthName "Roaming User"
           AuthUserFile /home/httpd/.htusers
           require valid-user
           PerlSetVar BaseDir /home/httpd/html/roaming
         </Location>

     In theory any AuthType and require statement should be possible
     as long as the $r->connection()->user() method returns something
     non trivial.

DESCRIPTION
   With Apache::Roaming you can use your Apache webserver as a
   Netscape Roaming Access server. This allows you to store you
   Netscape Communicator 4.5 preferences, bookmarks, address books,
   cookies etc. on the server so that you can use (and update) the
   same settings from any Netscape Communicator 4.5 that can access
   the server.

   The source is based on mod_roaming by Vincent Partington
   <[email protected]>, see

       http://www.xs4all.nl/~vincentp/software/mod_roaming.html

   Vincent in turn was inspired by a Perl script from Frederik
   Vermeulen <[email protected]>, see

       http://www.esat.kuleuven.ac.be/~vermeule/roam/put

   Compared to Apache::Roaming, this script doesn't need mod_perl.
   On the other hand it doesn't support the MOVE method, thus you
   need to set the li.prefs.http.useSimplePut attribute in your
   Netscape preferences. Due to the missing MOVE method, it may be
   even slower than Apache::Roaming and perhaps a little bit less
   stable.

   The modules features are:

   *       GET, HEAD, PUT, DELETE and MOVE are handled by the module.
           In particular the Non-standard MOVE method is
           implemented, although Apache doesn't know it by default.
           Thus you need no set the li.prefs.http.useSimplePut
           attribute to true.

   *       Directories are created automatically.

   *       The module is subclassable, so that you can create profiles
           on the fly or parse and modify the user preferences. See
           the Apache::Roaming::LiPrefs(3) manpage for an example
           subclass.

INSTALLATION
   First of all you need an Apache Web server with mod_perl
   support. The TypeHandler must be enabled, so you need to set
   PERL_TYPE=1 when running Makefile.PL. For example, I use the
   following statements to build Apache:

       cd mod_perl-1.16
       perl Makefile.PL APACHE_SRC=../apache_1.3.X/src DO_HTTPD=1 \
           USE_APACI=1 PERL_METHOD_HANDLERS=1 PERL_AUTHEN=1 \
           PERL_CLEANUP=1 PREP_HTTPD=1 PERL_STACKED_HANDLERS=1
       cd ../apache-1.3.3
       ./configure --activate-module=src/modules/perl/libperl.a
       make
       make install
       cd ../mod_perl-1.16
       make
       make install

   See the mod_perl docs for details.

   Once the web server is installed, you need to create a directory
   for roaming profiles, I assume /home/httpd/html/roaming in what
   follows, with /home/httpd/html being the servers root directory.
   Be sure, that this directory is writable for the web server,
   better for the web server only. For example I do

       mkdir /home/httpd/html/roaming
       chown nobody /home/httpd/html/roaming
       chgrp nobody /home/httpd/html/roaming
       chmod 700 /home/httpd/html/roaming

   with *nobody* being the web server user.

   Access to the roaming directory must be restricted and enabled
   via password only. Finally tell the web server, that
   Apache::Roaming is handling requests to this directory by adding
   something like this to your srm.conf or access.conf:

       PerlModule Apache::Roaming
       <Location /roaming>
         PerlHandler Apache::Roaming->handler
         PerlTypeHandler Apache::Roaming->handler_type
         AuthType Basic
         AuthName "Roaming User"
         AuthUserFile /home/httpd/.htusers
         require valid-user
         PerlSetVar BaseDir /home/httpd/html/roaming
       </Location>

   That's it!

NETSCAPE COMMUNICATOR CONFIGURATION
   Assuming your document root directory is /home/httpd/html and
   you want your profile files being located under
   http://your.host/roaming, do the following:

   1.)     Create a directory /home/httpd/html/roaming. Make it
           writable by the web server and noone else, for example
           by doing a

               mkdir /home/httpd/html/roaming
               chown nobody /home/httpd/html/roaming
                   # Insert your web servers UID here
               chmod 700 /home/httpd/html/roaming

   2.)     Start your communicator and open Preferences/Roaming User.
           Click the "Enable Roaming Access for this profile"
           checkbox.

   3.)     Open Preferences/Roaming User/Server Information. Click the
           "HTTP Server" checkbox and enter the Base URL
           "http://your.host/roaming/$USERID".

   That's all. Now hit the Ok button. A directory with the name of
   your user id should automatically be generated under /roaming
   and files should be stored there.

METHOD INTERFACE
   As already said, the Apache::Roaming module is subclassable. You
   can well use it by itself, but IMO the most important
   possibility is overwriting the GET method for complete control
   over the users settings.

 handler

     $result = Apache::Roaming->handler($r);

   (Class Method) The *handler* method is called by the Apache
   server for any request. It receives an Apache request $r. The
   methods main task is creating an instance of Apache::Roaming by
   calling the *new* method and then passing control to the
   *Authenticate*, *CheckDir* and *GET*, *PUT*, *DELETE* or *MOVE*,
   respectively, methods.

 handler_type

     $status = Apache::Roaming->handler_type($r)

   (Class Method) This method is required only, because the Apache
   server would refuse other methods than GET otherwise. It checks
   whether the requested method is GET, PUT, HEAD, DELETE or MOVE,
   in which case it returns the value OK. Otherwise the value
   DECLINED is returned.

 new

     $ar_req = Apache::Roaming->new(%attr);

   (Class Method) This is the modules constructor, called by the
   *handler* method. Instances of Apache::Request have the
   following attributes:

   basedir The roaming servers base directory, as an absolute path. You
           set this using a PerlSetVar instruction, see the
           INSTALLATION manpage above for an example.

   file    This is the path of the file being created (PUT), read
           (GET), deleted (DELETE) or moved (MOVE). It's an
           absolute path.

   method  The requested method, one of HEAD, GET, PUT, MOVE or DELETE.

   request This is the Apache request object.

   status  If a method dies, it should set this value to a return code
           like SERVER_ERROR (default), FORBIDDEN,
           METHOD_NOT_ALLOWED, or something similar from
           Apache::Constants. See the Apache::Constants(3) manpage.
           The *handler* method will catch Perl exceptions for you
           and generate an error page.

   user    Name the user authenticated as.

 Authenticate

     $ar_req->Authenticate();

   (Instance Method) This method is checking whether the user has
   authorized himself. The current implementation is checking only
   whether user name is given via $r->connection()->user(), in
   other words you can use simple basic authentication or something
   similar.

   The method should throw an exception in case of problems.

 CheckDir

     $ar_req->CheckDir();

   (Instance method) Once the user is authenticated, this method
   should determine whether the user is permitted to access the
   requested URI. The current implementation verifies whether the
   user is accessing a file in the directory $basedir/$user. If
   not, a Perl exception is thrown with $ar_req->{'status'} set to
   FORBIDDEN.

 GET, PUT, MOVE, DELETE

     $ar_req->GET();
     $ar_req->PUT();
     $ar_req->MOVE();
     $ar_req->DELETE();

   (Instance Methods) These methods are called finally for
   performing the real action. With the exception of GET, they call
   *Success* finally for reporting Ok.

   Alternative method names are possible, depending on the name of
   the requested file. For example, if you request the file
   *liprefs* via GET, then it is checked whether your sublass has a
   method *GET_liprefs*. If so, this method is called rather than
   the default method *GET*. The alternative method names are
   obtained by removing all non-alpha- numeric characters from the
   files base name. That is, if you request a file *pab.na2*, then
   the alternative name is *pabna2*. Note, these method names are
   case sensitive!

 MkDir

     $ar_req->MkDir($file);

   (Instance Method) Helper function of *PUT*, creates the
   directory where $file is located, if it doesn't yet exist. Works
   recursively, if more than one directory must be created.

 Success

     $ar_req->Success($status, $text);

   (Instance Method) Creates an HTML document with status $status,
   containing $text as success messages.

AUTHOR AND COPYRIGHT
   This module is

       Copyright (C) 1998    Jochen Wiedmann
                             Am Eisteich 9
                             72555 Metzingen
                             Germany

                             Phone: +49 7123 14887
                             Email: [email protected]

   All rights reserved.

   You may distribute this module under the terms of either the GNU
   General Public License or the Artistic License, as specified in
   the Perl README file.

SEE ALSO
   the Apache(3) manpage, the mod_perl(3) manpage

   An example subclass is Apache::Roaming::LiPrefs. See the
   Apache::Roaming::LiPrefs(3) manpage.

   A C module for Apache is mod_roaming, by Vincent Partington
   <[email protected]>, see

       http://www.xs4all.nl/~vincentp/software/mod_roaming.html

   Frederic Vermeulen <[email protected]> has written a
   CGI binary for roaming profiles. It's missing a MOVE method,
   though.

       http://www.esat.kuleuven.ac.be/~vermeule/roam/put