Initial commit. From Jonathon Sim <sim@zeald.com>

This commit is contained in:
Zone 2003-02-06 22:45:05 +00:00
parent 4697629414
commit efc0287bc1
6 changed files with 4825 additions and 0 deletions

View File

@ -0,0 +1,61 @@
<?php
$phpgw_info["flags"] = array("currentapp" => "phpwebhosting",
"noheader" => False,
"noappheader" => False,
"enable_vfs_class" => True);
include("../../header.inc.php");
function getmicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
function stats($array)
{
$mean = array_sum($array)/count($array);
$a = 0;
foreach ($array as $value)
{
$a += ($value - $mean)*($value - $mean);
}
$std = sqrt($a/count($array));
$error = $std/sqrt(count($array));
echo "mean time: $mean error: +-$error";
}
echo '<b>Benchmarking vfs::ls</b><br>';
$times = array();
$phpgw->vfs->cd();
for ($i=0;$i<20; $i++)
{
$phpgw->vfs->dav_client->cached_props = array();
$time1 = getmicrotime();
$result = $phpgw->vfs->ls (array ('string' => ''));
$time = getmicrotime() - $time1;
$times[] = $time;
echo "run $i: $time<br>";
//sleep(1);
flush();
}
stats($times);
echo '<br><b>Benchmarking dav_client::get_properties</b><br>';
$times = array();
$phpgw->vfs->cd();
for ($i=0;$i<20; $i++)
{
$phpgw->vfs->dav_client->cached_props = array();
$time1 = getmicrotime();
$result = $phpgw->vfs->dav_client->get_properties('/home/sim');
$time = getmicrotime() - $time1;
$times[] = $time;
echo "run $i: $time<br>";
flush();
}
stats($times);
?>

View File

@ -0,0 +1,531 @@
<?php
function ok($string){
/* html_table_row_begin();
html_table_col_begin();*/
echo "<h3>$string ";
/* html_table_col_end();
html_table_col_begin();*/
echo " OK</h3>";
/* html_table_col_end();
html_table_row_end();*/
}
function fail($string){
/* html_table_row_begin();
html_table_col_begin();*/
echo "<h3>$string ";
/* html_table_col_end();
html_table_col_begin();*/
echo " <b>FAILED!</b></h3>";
/* html_table_col_end();
html_table_row_end(); */
}
$phpgw_info["flags"] = array("currentapp" => "filemanager",
"noheader" => False,
"noappheader" => False,
"enable_vfs_class" => True);
include("../../header.inc.php");
html_text('VFS_DAV tests:');
html_break (1);
html_text_italic (PHP_OS . " - " . $phpgw_info["server"]["db_type"] . " - " . PHP_VERSION . " - " . $phpgw->vfs->basedir);
html_break (1);
//html_table_begin();
$sep = SEP;
$user = $phpgw->vfs->working_lid;
$homedir = $phpgw->vfs->fakebase . "/" . $user;
$realhomedir = preg_replace ("|/|", $sep, $homedir);
$filesdir = $phpgw->vfs->basedir;
$currentapp = $phpgw_info["flags"]["currentapp"];
$time1 = time();
echo ' override locks : ';print_r($phpgw->vfs->override_locks);
###
# write test
$phpgw->vfs->cd ();
$testfile = 'sdhdsjjkldggfsbhgbnirooaqojsdkljajklvagbytoi-test';
$teststring = 'delete me' ;
if (!$result = $phpgw->vfs->write (array ('string' => $testfile,
'content' => $teststring
)))
{
fail( __LINE__." failed writing file!");
}
else
{
ok("write");
}
#read
$phpgw->vfs->cd ();
$result = $phpgw->vfs->read (array ('string' => $testfile, 'noview' => true ));
if (!$result==$teststring)
{
fail( __LINE__." failed reading file!");
}
else
{
ok(" read");
}
###
# ls test
$result1 = $phpgw->vfs->ls (array ('string' => $testfile ));
if (!count($result1))
{
fail(__LINE__." failed listing file!");
}
else
{
ok(" ls : known file");
}
//list the parent dir
$result = $phpgw->vfs->ls (array ('string' => ''));
foreach ($result as $file)
{
if ($testfile == $file['name'])
{
$found = true;
break;
}
}
if (!$found)
{
fail(__LINE__." failed listing file!");
}
else
{
ok(" ls : parent");
}
$found = false;
foreach ($result as $file)
{
if ($result1[0]['directory'] == $file['full_name'])
{
$found = true;
break;
}
}
if ($found)
{
fail(__LINE__." parent is present in its own listing!");
}
else
{
ok(" ls : parent self reference");
}
# getsize
$phpgw->vfs->cd ();
$result = $phpgw->vfs->get_size (array ('string' => $testfile ));
$len = strlen($teststring);
if (!($result== $len))
{
fail(__LINE__." failed getting size of file result $result strlen $len");
}
else
{
ok("get_size");
}
#filetype
$phpgw->vfs->cd ();
$result = $phpgw->vfs->file_type(array ('string' => $testfile ));
$len = strlen($teststring);
if (!($result== 'application/octet-stream'))
{
fail(__LINE__." failed getting file type $result");
}
else
{
ok("file_type");
}
#file_exists
$phpgw->vfs->cd ();
$result = $phpgw->vfs->file_exists(array ('string' => $testfile ));
if (!$result)
{
fail(__LINE__." file_exist failed: $result");
}
else
{
ok("file_exists");
}
#lock
$phpgw->vfs->cd ();
$result = $phpgw->vfs->lock (array ('string' => $testfile ));
if (!$result)
{
fail(__LINE__."failed locking file!");
}
else
{
ok(" lock");
}
$ls_array = $GLOBALS['phpgw']->vfs->ls (array (
'string' => $testfile,
'relatives' => array (RELATIVE_ALL),
'checksubdirs' => False
)
);
if (!count($ls_array[0]['locks']))
{
fail(__LINE__."after locking file no locks exist!");
}
else
{
ok(" lock: after locking lock exists.");
}
$lock = end($ls_array[0]['locks']);
$tokens = end($lock['lock_tokens']);
$token = $tokens['name'];
//write should now fail
$result = $phpgw->vfs->write (array ('string' => $testfile,
'content' => 'delete me'
));
if ($result)
{
fail(__LINE__."I can write a supposidly locked file!");
}
else
{
ok("lock: after locking write fails");
}
$phpgw->vfs->add_lock_override(array ('string' => $testfile));
$result = $phpgw->vfs->write (array ('string' => $testfile,
'content' => 'delete me'
));
if (!$result)
{
fail(__LINE__."I cant write a locked file after overriding the lock!");
}
else
{
ok("lock: after lock override write succeeds");
}
###
# unlock test
$phpgw->vfs->cd ();
$result = $phpgw->vfs->unlock (array ('string' => $testfile ), $token);
if (!$result)
{
fail( __LINE__."failed unlocking file!");
}
else
{
OK("unlock");
}
#server side copy
$phpgw->vfs->cd ();
$result = $phpgw->vfs->cp(array ('from' => $testfile,
'to' => $testfile.'2',
'relatives' => array (RELATIVE_ALL, RELATIVE_ALL)
));
if (!$result)
{
fail(__LINE__." failed copying! returned: $result");
}
else
{
ok("server-side copy");
}
$result = $phpgw->vfs->file_exists(array ('string' => $testfile.'2'
));
if (!$result)
{
fail(__LINE__." after copy, target doesnt exist!");
}
else
{
ok("server-side copy : test for target");
}
$result = $phpgw->vfs->read (array ('string' => "$testfile".'2',
'noview' => true,
'relatives' => array (RELATIVE_ALL)
));
if (!$result==$teststring)
{
fail( __LINE__."after copy, read returned '$result' not '$teststring' ");
}
else
{
ok(" server-side copy: read target");
}
$result = $phpgw->vfs->delete(array ('string' => $testfile.'2'
));
if (!$result)
{
fail(__LINE__." failed copying! delete copied file returned: $result");
}
else
{
ok("server-side copy : delete target");
}
#remote -> local copy
$phpgw->vfs->cd ();
echo "<pre>";
$result = $phpgw->vfs->cp(array ('from' => $testfile,
'to' => "/tmp/$testfile".'2',
'relatives' => array (RELATIVE_ALL, RELATIVE_NONE | VFS_REAL)
));
echo "</pre>";
if (!$result)
{
fail(__LINE__." failed remote->local copying! returned: $result");
}
else
{
ok("remote->local copy");
}
echo "<pre>";
$result = $phpgw->vfs->file_exists(array ('string' => "/tmp/$testfile".'2',
'relatives' => array (RELATIVE_NONE | VFS_REAL)
));
echo "</pre>";
if (!$result)
{
fail(__LINE__." after remote->local copy, target doesnt exist!");
}
else
{
ok("remote->local copy : test for target");
}
$phpgw->vfs->cd ();
echo "<pre>";
$result = $phpgw->vfs->read (array ('string' => "/tmp/$testfile".'2',
'noview' => true,
'relatives' => array (RELATIVE_NONE | VFS_REAL)
));
echo "</pre>";
if (!$result==$teststring)
{
fail( __LINE__."after remote->local copy, returned $result");
}
else
{
ok(" remote->local copy: read target");
}
echo "<pre>";
$result = $phpgw->vfs->delete(array ('string' => "/tmp/$testfile".'2',
'relatives' => array (RELATIVE_NONE | VFS_REAL)
));
echo "</pre>";
if (!$result)
{
fail(__LINE__." failed copying! delete copied file returned: $result");
}
else
{
ok("remote->local copy : delete target");
}
#move
$phpgw->vfs->cd ();
echo "<pre>";
$result = $phpgw->vfs->mv(array ('from' => $testfile,
'to' => $testfile.'2',
'relatives' => array (RELATIVE_ALL, RELATIVE_ALL)
));
echo "</pre>";
if (!$result)
{
fail(__LINE__." failed moving! returned: $result");
}
else
{
ok("server-side move");
}
$result = $phpgw->vfs->file_exists(array ('string' => $testfile,
));
if ($result)
{
fail(__LINE__." failed moving! returned: $result");
}
else
{
ok("server-side move : test for source");
}
$result = $phpgw->vfs->file_exists(array ('string' => $testfile.'2',
));
if (!$result)
{
fail(__LINE__." failed moving! returned: $result");
}
else
{
ok("server-side move : test for target");
}
echo "<pre>";
$result = $phpgw->vfs->read (array ('string' => $testfile.'2',
'noview' => true,
'relatives' => array (RELATIVE_ALL)
));
echo "</pre>";
if (!$result==$teststring)
{
fail( __LINE__."after move, read returned '$result' not '$teststring' ");
}
else
{
ok(" server-side move: read target");
}
echo "<pre>";
$result = $phpgw->vfs->mv(array ('from' => $testfile.'2',
'to' => $testfile,
'relatives' => array (RELATIVE_ALL, RELATIVE_ALL)
));
echo "</pre>";
if (!$result)
{
fail(__LINE__." failed moving! returned: $result");
}
else
{
ok("server-side move : move back");
}
#remote->local move
echo "<pre>";
$phpgw->vfs->cd ();
$result = $phpgw->vfs->mv(array ('from' => $testfile,
'to' => '/tmp/'.$testfile.'2',
'relatives' => array (RELATIVE_ALL, RELATIVE_NONE | VFS_REAL)
));
echo "</pre>";
if (!$result)
{
fail(__LINE__." failed moving! returned: $result");
}
else
{
ok("remote->local move");
}
$result = $phpgw->vfs->file_exists(array ('string' => $testfile,
));
if ($result)
{
fail(__LINE__." failed moving! returned: $result");
}
else
{
ok("remote->local move : test for source");
}
$result = $phpgw->vfs->file_exists(array ('string' => '/tmp/'.$testfile.'2',
'relatives' => array(RELATIVE_NONE | VFS_REAL)
));
if (!$result)
{
fail(__LINE__." failed moving! returned: $result");
}
else
{
ok("remote->local move : test for target");
}
$result = $phpgw->vfs->read (array ('string' => '/tmp/'.$testfile.'2',
'noview' => true,
'relatives' => array(RELATIVE_NONE | VFS_REAL)
));
if (!$result==$teststring)
{
fail( __LINE__."after move, read returned '$result' not '$teststring' ");
}
else
{
ok("remote->local move: read target");
}
echo "<pre>";
$result = $phpgw->vfs->mv(array ('from' => '/tmp/'.$testfile.'2',
'to' => $testfile,
'relatives' => array (RELATIVE_NONE | VFS_REAL, RELATIVE_ALL)
));
echo "</pre>";
if (!$result)
{
fail(__LINE__." failed moving! returned: $result");
}
else
{
ok("server-side move : move back");
}
###
# delete test
$phpgw->vfs->cd ();
$result = $phpgw->vfs->delete(array ('string' => $testfile ));
if (!$result)
{
fail(__LINE__."failed deleting file! returned: $result");
}
else
{
ok("delete");
}
###
# mkdir test
$phpgw->vfs->cd ();
$result = $phpgw->vfs->mkdir(array ('string' => $testfile ));
if (!$result)
{
fail(__LINE__."failed creating collection! returned: $result");
}
else
{
ok("mkdir");
}
$result = $phpgw->vfs->write (array ('string' => $testfile.'/'.$testfile.'2',
'content' => $teststring
));
if (!$result)
{
fail( __LINE__." failed writing file into new dir!");
}
else
{
ok("mkdir : write into dir");
}
###
# rm dir test
$phpgw->vfs->cd ();
$result = $phpgw->vfs->rm(array ('string' => $testfile ));
if (!$result)
{
fail(__LINE__." failed deleting collection! returned: $result");
}
else
{
ok("delete dir");
}
//html_table_end();
$time = time() - $time1;
html_text("Done in $time s");
html_page_close ();
?>

View File

@ -0,0 +1,122 @@
vfs_dav: WebDAV support for phpGroupWare
----------------------------------------
WARNING::This is still alpha-quality code, and may delete all your files,
corrupt all your data, and run away with your daughter. Dont use it unless
you know what your doing.
This package contains classes and patches implementing a virtual filesystem
for phpGroupWare (0.9.14) that uses a WebDAV file repository as a
storage area. This allows you to store your files online in phpgroupware,
in a way that cooperates well with other web applications (for instance,
in Windows you can then access your files as a "web folder", and similarly
KDE, Gnome, MacOSX, and a multitude of applications all include some way of
browsing files on a WebDAV share)
Features
--------
- (should be) fully compatible with the WebDAV standard, as specified in
RFC2518 http://www.ietf.org/rfc/rfc2518.txt (NB : this doesn't imply that it
is :) only that I consider it a bug if it isn't )
- Maps vfs properties (eg creator_id etc) to the Dublin Core metadata
specification (http://dublincore.org/) (eg "author") where possible, and
stores them as DAV properties
- Limited Access control support - when you create a dir in groupware, it
puts a .htaccess file in it with "limit user <username>" in it. Combined
with an Apache module authenticating against your phpgroupware account
database, this provides reasonable user-security (proper ACL support is
trickier to implement though :(
TODO:
-----
- DELTA-V versioning extensions, using the subversion DELTA-V server
- Journalling -> Versioning. Journalling is currently unimplemented
- Locking (phpGroupWare doesn't really have any locking mechanism yet)
- ACL support for users accessing through an external webdav client.
Installation
------------
To install:
1/ Setup a WebDAV server - currently this code has only been well tested using
Apache's mod_dav (http://www.webdav.org/mod_dav/). To setup mod_dav ensure
that you have the module installed correctly ( RTFM :) and create a virtual
host (eg files.yourdomain.com) something like this:
<VirtualHost files.yourdomain.com:80>
AccessFileName .htaccess
ServerAdmin webmaster@yourdomain.com
DocumentRoot /var/files
<Location />
AllowOverride All
Options +Indexes
DAV on
DirectoryIndex /
RemoveHandler .php .php4 .php3 .phtml
</Location>
<Files ~ "^\.ht">
#This ensures phpgroupware can modify .htaccess files
order deny,allow
deny from all
#make sure your phpgroupware server is included here.
allow from localhost .localdomain 192.168.
</Files>
ServerName files.yourdomain.com
ErrorLog logs/dav_err
CustomLog logs/dav_acc combined
</VirtualHost>
2/ On the setup page (phpgroupware/setup/config.php) specify
the WebDAV server URL (eg http://files.yourdomain.com ) in the: "Full path
for users and groups files" text area, and select DAV in:
"Select where you want to store/retrieve filesystem information"
combo. If your file repository supports SSL you might want to enter
'https://files.yourdomain.com' instead - note that phpGroupWare itself wont
use SSL to access the repository, but when it redirects the users browser to
the repository it will use the secure https url.
3/ Make sure your WebDAV repository contains a "home" directory (important!)
So if your WebDAV directory is /var/files, you would need:
/var/files/
/var/files/home/
4/ To enable authentication you must use a third-party Apache authentication
module. Which you use depends on how you have setup authentication in
phpGroupWare - for instance if you use an SQL DB (the default) then set up
mod_auth_pgsql (http://www.giuseppetanzilli.it/mod_auth_pgsql/) or
mod_auth_mysql (http://modauthmysql.sourceforge.net/)
An example .htaccess file is included for postgresql - mysql would be
similar. Your file repository also needs to be configured to allow
phpGroupWare to write .htaccess files (the setup in (3) will allow this)
Note that using an Apache module for authentication is not strictly
required in order to use WebDAV within phpGroupWare.
Authors
-------
Jonathon Sim <sim@zeald.com> for Zeald Ltd (http://zeald.com), Paolo Andreetto
<paolo@prosa.it>. Also contains code from the Net_HTTP_Client PHP class
(http://lwest.free.fr/doc/php/lib/net_http_client-en.html) by Leo West
<west_leo@yahoo.com>.
License
-------
By using this software you agree to the terms of the GNU LGPL: this is the same
license that the phpGroupWare API is distributed under:
Copyright (C) 2002 Zeald Ltd.
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License,
or any later version.
This library 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

View File

@ -0,0 +1,21 @@
php_flag engine off
RemoveHandler cgi-script .cgi .pl
RemoveType application/x-httpd-php .php .php3
RemoveType application/x-httpd-php-source .phps
AuthName "Groupware File Repository"
AuthType basic
Auth_PG_cache_passwords on
Auth_PG_host orion.zeald.com
Auth_PG_database gw_zeald
Auth_PG_user zeald
Auth_PG_pwd password
Auth_PG_pwd_table phpgw_accounts
Auth_PG_grp_table phpgw_accounts
Auth_PG_uid_field account_lid
Auth_PG_pwd_field account_pwd
Auth_PG_gid_field account_groups
Auth_PG_hash_type MD5
Auth_PG_pwd_whereclause " AND account_status='A' AND account_type='u' AND account_expires<NOW()"
Auth_PG_grp_whereclause " AND account_status='A' AND account_type='g' AND account_expires<NOW()"
require valid-user

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff