NAME

CGI::FileManager - Managing a directory structure on an HTTP server

SYNOPSIS

Enable authenticated users to do full file management on a subdirectory somewhere with a web server installed.

After installing the module you have to create a file with usernames and passwords in it. For this we supply cfm-passwd.pl which should have been installed in your PATH. Type:

> cfm-passwd.pl /home/user/mypwfile add someuser

It will ask for password and the home directory that the use is supposed to be able to manage.

Then in nearby CGI script:

 #!/usr/bin/perl -wT
 use strict;
 
 use CGI::FileManager;
 my $fm = CGI::FileManager->new(
			PARAMS => {
				AUTH => {
					PASSWD_FILE => "/home/user/mypwfile",
				}
			}
		);
 $fm->run;

Now point your browser to the newly created CGI file and start managing your files.

WARNING

This is Software is in Alpha version. Its interface, both human and programatic
*will* change. If you are using it, please make sure you always read the Changes
section in the documentation.

VERSION

Version 0.05

DESCRIPTION

Enables one to do basic file management operations on a filesystem under an HTTP server. The actions on the file system provide hooks that let you implement custom behavior on each such event.

It can be used as a base class for a simple web application that mainly manipulates files.

Methods

cgiapp_init

Initialize application (standard CGI::Application)

setup

Standart CGI::Appication method to setup the list of all run modes and the default run mode

cgiapp_prerun

Regular CGI::Application method

redirect

Just to easily redirect to the home page

load_tmpl

Change the default behaviour of CGI::Application by overriding this method. By default we'll load the template from within our module.

message

Print an arbitrary message to the next page

login

Show login form

login_process

Processing the login information, checking authentication, configuring the session object or giving error message.

authenticate

Called without parameter. Returns an objects that is capable to authenticate a user.

By default it returns a CGI::FileManager::Auth object.

It is planned that this method will be overriden by the user to be able to replace the authentication back-end. Currently the requirements from the returned object is to have these methods:

$a->verify(username, password)   returns true/false
$a->home(username)               return the full path to the home directory of the given user

WARNING: this interface might change in the future, before we reach version 1.00 Check the Changes.

logout

logout and mark the session accordingly.

change_dir

Changes the current directory and then lists the new current directory

list_dir

Listing the content of a directory

delete_file

Delete a file from the server

remove_directory

Remove a directory

unzip

unzip

rename_form

Rename file form

rename

Rename file

upload_file

Upload a file

create_directory

Create a directory

DEFAULT

To get the default behavior you can write the following code. The module will use the built in templates to create the pages.

 #!/usr/bin/perl -wT
 use strict;
 
 use CGI::FileManager;
 my $fm = CGI::FileManager->new(
			PARAMS => {
				AUTH => {
					PASSWD_FILE => "/home/user/mypwfile",
				}
			}
		);
 $fm->run;
new(OPTIONS)

META-DATA

Theoretically we could manage some meta-data about each file in some database that can be either outside our virtual file system or can be a special file in each directory.

Limitations

The user running the web server has to have read/write access on the relevant part of the file system in order to carry out all the functions.

USE CASES

Virtual web hosting with no ftp access for one user

A single user needs authentication and full access to one directory tree. This does not work yet.

 #!/usr/bin/perl -T
 
 use CGI::FileManager;
 my $fm = CGI::FileManager->new({
             ROOT => "/home/gabor/web/client1",
	     AUTH => ["george", "WE#$%^DFRE"],   # the latter is the crypt-ed password we expect
             });
 $fm->run;

Virtual web hosting with no ftp access for a number of users

A number of users need authentication and full access to one directory tree per user.

 #!/usr/bin/perl -T
 
 use CGI::FileManager;
 my $fm = CGI::FileManager->new(
			PARAMS => {
				AUTH => {
					PASSWD_FILE => "/home/user/mypwfile",
				}
			}
		);
 $fm->run;

 The mypwfile file looks similar to an /etc/passwd file:
 username:password:uid:gid:geco:homedir:shell

 gid and shell are currently not used
 homedir is the directory the user has rights for
 password is encrypted by crypt
 uid is just a unique number

Changes

v0.01 2004 June 27

Initial release

v0.02_01

Move file/directory
Unzip file (.zip)

v0.02_02

Separate CGI::FileManager::Templates
add cfm-install.pl install script


Use CGI::Application::Plugin::Session
remove catching the warning of CA and require higher version of CA
add a test that test a particular warning
some subs were called as functions, now they are called as methods allowing better subclassing

TODO

- install the module as regular CPAN module and add a script that will generate the templates
  and hard-code their location in the script.

- Replace the Unix::ConfigFile with my own implementation

Test the module on Windows and find out what need to be done to pass the windows
tests ? Especially look at Unix::ConfigFile

Show most of the error messages on the directory listing page

Support for filenames with funny characters (eg. space)

Test all the functions, look for security issues !
Show the current directory  (the virtual path)
Separate footer/header
Enable external templates

Security issues: can I be sure that unzipping a file will open files only under the current directory ?
What should I do in case a file that comes from an unzip operation already exists ?

ZIP: currently the path to unzip is hard coded. It probably should be replaced by Archive::Zip

More fancy things:
Create file
Copy file/directory
Unzip file (tar/gz/zip)
Edit file (simple editor)

look at CGI::Explorer and check what is the relationsip to it ?

Author

Gabor Szabo, <gabor@pti.co.il>

Bugs

Please report any bugs or feature requests to bug-cgi-filemanager@rt.cpan.org, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

Copyright & License

Copyright 2004 Gabor Szabo, All Rights Reserved. http://www.szabgab.com/

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

See also

CGI::Upload, WWW::FileManager, CGI::Uploader