Initial revision; rough drafts

This commit is contained in:
zone 2001-06-20 08:16:13 +00:00
parent adeba0e1eb
commit 6fb4f5b369
13 changed files with 6458 additions and 0 deletions

164
phpgwapi/doc/vfs/inline2lyx.pl Executable file
View File

@ -0,0 +1,164 @@
#!/usr/bin/perl
#Created by Jason Wies (Zone, zone@users.sourceforge.net)
#Copyright 2001 Jason Wies
#Released under GNU Public License
#Converts HeaderDoc style inline comments to LyX style LaTeX
#Usage: ./inline2lyx.pl file Title Author Date Abstract
if (!@ARGV[0])
{
print "Usage: ./inline2lyx.pl file Title Author Date Abstract\n";
exit;
}
$output .= '\lyxformat 2.16
\textclass linuxdoc
\language default
\inputencoding latin1
\fontscheme default
\graphics default
\paperfontsize default
\spacing single
\papersize Default
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\paperorientation portrait
\secnumdepth 2
\tocdepth 2
\paragraph_separation indent
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default
\layout Title
\added_space_top vfill \added_space_bottom vfill
' . @ARGV[1] . '
\layout Author
' . @ARGV[2] . '
\layout Date
' . @ARGV[3] . '
\layout Abstract
' . @ARGV[4] . '
\layout Section
' . @ARGV[1];
$file = `cat @ARGV[0]`;
@lines = split ('\n', $file);
foreach $line (@lines)
{
undef $start;
undef $class;
undef $function;
undef $abstract;
undef $param;
undef $result;
undef $discussion;
undef $end;
undef $layout;
if ($line =~ /\/\*\!/)
{
$in = 1;
$start = 1;
}
if ($looking && $line =~ /function/)
{
$layout = "verbatim";
undef $looking;
}
elsif (!$in)
{
goto next;
}
if ($line =~ /\@(class)/)
{
$layout = "subsection";
$name = $1;
$class = 1;
}
if ($line =~ /\@(function)/)
{
$layout = "subsection";
$name = $1;
$function = 1;
}
if ($line =~ /\@(abstract)/)
{
$layout = "standard";
$name = $1;
$abstract = 1;
}
if ($line =~ /\@(description)/)
{
$layout = "standard";
$name = $1;
$description = 1;
}
if ($line =~ /\@(param)/)
{
$layout = "standard";
$name = $1;
$param = 1;
}
if ($line =~ /\@(result)/)
{
$layout = "standard";
$name = $1;
$result = 1;
}
if ($line =~ /\@(discussion)/)
{
$layout = "standard";
$name = $1;
$discussion = 1;
}
if ($line =~ /\*\// && $in)
{
undef $in;
$looking = 1;
$end = 1;
}
if ($layout)
{
$output .= "\n\n" . '\layout ' . ucfirst ($layout);
$line =~ s/\@function//;
$line =~ s/\@//;
$data = ucfirst ($line);
if (!$function && !$class)
{
$data =~ s/$name/$name:/;
}
$output .= "\n$data";
if ($function || $class)
{
$output .= "\n" . '\begin_inset LatexCommand \label{sec:' . "$data" . '}' . "\n\n" . '\end_inset';
}
}
elsif ($in && !$start)
{
$output .= '\layout Standard' . "\n$line";
}
next:
}
$output .= "\n" . '\the_end';
print $output;

View File

@ -0,0 +1,27 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.7.4">
<TITLE>phpgwapi - VFS Class: Introduction and Purpose</TITLE>
<LINK HREF="vfs-2.html" REL=next>
<LINK HREF="vfs.html#toc1" REL=contents>
</HEAD>
<BODY>
<A HREF="vfs-2.html">Next</A>
Previous
<A HREF="vfs.html#toc1">Contents</A>
<HR>
<H2><A NAME="sec:introduction"></A> <A NAME="s1">1.</A> <A HREF="vfs.html#toc1">Introduction and Purpose</A></H2>
<P>The latest version of the VFS for phpGroupWare combines actual file system
manipulation with fully integrated database support. It features nearly transparent
handling of files and directories, as well as files inside and outside the
virtual root. This document is intended to provide API and application developers
with a guide to incorporating the VFS into their work.</P>
<HR>
<A HREF="vfs-2.html">Next</A>
Previous
<A HREF="vfs.html#toc1">Contents</A>
</BODY>
</HTML>

108
phpgwapi/doc/vfs/vfs-2.html Normal file
View File

@ -0,0 +1,108 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.7.4">
<TITLE>phpgwapi - VFS Class: Basics</TITLE>
<LINK HREF="vfs-3.html" REL=next>
<LINK HREF="vfs-1.html" REL=previous>
<LINK HREF="vfs.html#toc2" REL=contents>
</HEAD>
<BODY>
<A HREF="vfs-3.html">Next</A>
<A HREF="vfs-1.html">Previous</A>
<A HREF="vfs.html#toc2">Contents</A>
<HR>
<H2><A NAME="sec:basics"></A> <A NAME="s2">2.</A> <A HREF="vfs.html#toc2">Basics</A></H2>
<H2><A NAME="sec:prerequisites"></A> <A NAME="ss2.1">2.1</A> <A HREF="vfs.html#toc2.1">Prerequisites</A>
</H2>
<P>You must explicitly enable the VFS class. To do this, set "enable_vfs_class"
to True in $phpgw_info[&quot;flags&quot;]. An example:</P>
<P>
<PRE>
$phpgw_info[&quot;flags&quot;] = array(&quot;currentapp&quot; =&gt; &quot;phpwebhosting&quot;,
&quot;noheader&quot; =&gt; False,
&quot;noappheader&quot; =&gt; False,
&quot;enable_vfs_class&quot; =&gt; True,
&quot;enable_browser_class&quot; =&gt; True);
</PRE>
</P>
<H2><A NAME="sec:concepts"></A> <A NAME="ss2.2">2.2</A> <A HREF="vfs.html#toc2.2">Concepts</A>
</H2>
<P>The VFS in located in phpgwapi/inc/class.vfs.inc.php. You can look over
it, but I don't suggest trying to understand how it works. It isn't necessary
to know its internals to use it, but you may find the inline comments helpful.
The basic things to keep in mind:</P>
<P>
<UL>
<LI>Files and directories are synonymous in almost all cases</LI>
</UL>
</P>
<P>
<PRE>
$phpgw-&gt;vfs-&gt;mv ("file1", "dir/file2");
$phpgw-&gt;vfs-&gt;mv ("dir1", "dir/dir1");
$phpgw-&gt;vfs-&gt;rm ("file");
$phpgw-&gt;vfs-&gt;rm ("dir");
</PRE>
</P>
<P>All work as you would except them to. The major exception is:</P>
<P>
<PRE>
$phpgw-&gt;vfs-&gt;touch ("file");
</PRE>
</P>
<P>vs.</P>
<P>
<PRE>
$phpgw-&gt;vfs-&gt;mkdir ("dir");
</PRE>
</P>
<P>
<UL>
<LI>Users and groups and synonymous</LI>
</UL>
</P>
<P>As far as the actual paths are concerned, users and groups are the same.
The VFS has no built in ACL support, so /home/username works the same as /home/groupname.
See the note on AC L support in the Notes section.</P>
<P>
<UL>
<LI>You should never have to know the real path of files</LI>
</UL>
</P>
<P>One of the VFS's responsibilities is to translate paths for you. While
you certainly <EM>can</EM> operate using full paths, it is much simpler to use the virtual
paths. For example, instead of using:</P>
<P>
<PRE>
$phpgw-&gt;vfs-&gt;cp ("/var/www/phpgroupware/files/home/user/file1", "/var/www/phpgroupware/files/home/user/file2", array (RELATIVE_NONE|VFS_REAL, RELATIVE_NONE|VFS_REAL));
</PRE>
</P>
<P>you might use</P>
<P>
<PRE>
$phpgw-&gt;vfs-&gt;cp ("/home/user/file1", "/home/user/file2", array (RELATIVE_NONE, RELATIVE_NONE));
</PRE>
</P>
<P>(We'll get to the RELATIVE's in a minute.)</P>
<P>Site administrators should be able to move their files dir around on their
system and know that everything will continue to work smoothly.</P>
<P>
<UL>
<LI>Relativity is <EM>vital</EM></LI>
</UL>
</P>
<P>Relativity is a new feature in the VFS, and its importance cannot be stressed
enough. It will make your life much easier, especially for file system intensive
applications, but it will take some getting used to. If something doesn't work
right the first time, chances are great it has to do with incorrect relativity
settings. We will deal with relativity in depth in the Relativity section.</P>
<HR>
<A HREF="vfs-3.html">Next</A>
<A HREF="vfs-1.html">Previous</A>
<A HREF="vfs.html#toc2">Contents</A>
</BODY>
</HTML>

106
phpgwapi/doc/vfs/vfs-3.html Normal file
View File

@ -0,0 +1,106 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.7.4">
<TITLE>phpgwapi - VFS Class: Basic Functions</TITLE>
<LINK HREF="vfs-4.html" REL=next>
<LINK HREF="vfs-2.html" REL=previous>
<LINK HREF="vfs.html#toc3" REL=contents>
</HEAD>
<BODY>
<A HREF="vfs-4.html">Next</A>
<A HREF="vfs-2.html">Previous</A>
<A HREF="vfs.html#toc3">Contents</A>
<HR>
<H2><A NAME="sec:basic_functions"></A> <A NAME="s3">3.</A> <A HREF="vfs.html#toc3">Basic Functions</A></H2>
<P>These are two functions you'll need to know before we get into relativity.</P>
<H2><A NAME="sec:path_parts"></A> <A NAME="ss3.1">3.1</A> <A HREF="vfs.html#toc3.1">path_parts ()</A>
</H2>
<P>The job of path_parts () is to translate any given file location into its
many component parts for any relativity. The prototype for path_parts () is:</P>
<P>
<PRE>
function path_parts ($string, $relatives = array (RELATIVE_CURRENT), $object = True)
</PRE>
</P>
<P>$string is the path you want to translate, $relatives is
the standard relativity array, and $object specifies how you would like
the return value: if $object is True, an object will be returned; if
$object is False, an array will be returned. I think you'll find the
object easier to deal with, and we'll be using it throughout this document.
The most important returned values (but not all) for path_parts () are:</P>
<P>
<PRE>
fake_full_path
fake_leading_dirs
fake_extra_path
fake_name
real_full_path
real_leading_dirs
real_extra_path
real_name
</PRE>
</P>
<P>Just like you would think, fake_full_path contains the full virtual path
of $string, and real_full_path contains the full real path of $string.
The fake_name and real_name variables should always be the same, and contain
the final file or directory name. The leading_dirs contain everything except
the name, and the extra_path is everything from the / before "home" to the end
of the leading_dirs. To better illustrate, here is an example:</P>
<P>
<PRE>
$p = $phpgw-&gt;vfs-&gt;path_parts ("/home/jason/dir/file", array (RELATIVE_NONE));
</PRE>
</P>
<P>
<UL>
<LI>$p-&gt;fake_full_path - /home/jason/dir/file</LI>
<LI>$p-&gt;fake_leading_dirs - /home/jason/dir</LI>
<LI>$p-&gt;fake_extra_path - home/jason/dir</LI>
<LI>$p-&gt;fake_name - file</LI>
<LI>$p-&gt;real_full_path - /var/www/phpgroupware/files/home/jason/dir/file</LI>
<LI>$p-&gt;real_leading_dirs - /var/www/phpgroupware/files/home/jason/dir
</LI>
<LI>$p-&gt;real_extra_path - home/jason/dir</LI>
<LI>$p-&gt;real_name - file</LI>
</UL>
</P>
<P>As you can see, path_parts () is a very useful function and will save you
from doing those darn substr ()'s yourself. For those of you used to the prior
VFS, note that <EM>getabsolutepath () is depreciated</EM>. getabsolutepath () still
exists (albeit in a much different form), and is responsible for some of the
path translation, but it is an <EM>internal</EM> function only. Applications should
only use path_parts (). We have shown you how to use path_parts () so you can
experiment with it using different paths and relativities as we relativity
in Section
<A HREF="vfs-4.html#sec:relativity"></A>.</P>
<H2><A NAME="sec:cd"></A> <A NAME="ss3.2">3.2</A> <A HREF="vfs.html#toc3.2">cd ()</A>
</H2>
<P>Ok, one more thing before we discuss relativity, and that is the cd ()
function. Part of the overall goal for the VFS in phpGroupWare is to give the
user a seamless experience during their session. For example, if they upload
a file using a file manager to /home/my_group/project1, and then go to download
an email attachment, the default directory will be /home/my_group/project1.
This is accomplished using the cd () function. The prototype and examples:</P>
<P>
<PRE>
function cd ($target = &quot;/&quot;, $relative = True, $relatives = array (RELATIVE_CURRENT))
$phpgw-&gt;vfs-&gt;cd ("/"); /* cd to their home directory */
$phpgw-&gt;vfs-&gt;cd ("/home/jason/dir", False, array (RELATIVE_NONE)); /* cd to /home/jason/dir */
$phpgw-&gt;vfs-&gt;cd ("dir2", True); /* When following the above, cd's to /home/jason/dir/dir2 */
</PRE>
</P>
<P>If $relatives is True, the $target is simply appended to
the current path. If you want to know what the current path is, use $phpgw-&gt;vfs-&gt;pwd
().</P>
<P>Now you're ready for relativity.</P>
<HR>
<A HREF="vfs-4.html">Next</A>
<A HREF="vfs-2.html">Previous</A>
<A HREF="vfs.html#toc3">Contents</A>
</BODY>
</HTML>

155
phpgwapi/doc/vfs/vfs-4.html Normal file
View File

@ -0,0 +1,155 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.7.4">
<TITLE>phpgwapi - VFS Class: Relativity</TITLE>
<LINK HREF="vfs-5.html" REL=next>
<LINK HREF="vfs-3.html" REL=previous>
<LINK HREF="vfs.html#toc4" REL=contents>
</HEAD>
<BODY>
<A HREF="vfs-5.html">Next</A>
<A HREF="vfs-3.html">Previous</A>
<A HREF="vfs.html#toc4">Contents</A>
<HR>
<H2><A NAME="sec:relativity"></A> <A NAME="s4">4.</A> <A HREF="vfs.html#toc4">Relativity</A></H2>
<P>Ok, just one last thing before we get into relativity. You will notice
throughout the examples the use of $fakebase. $fakebase is by
default "/home". The old VFS was hard-coded to use "/home", but the naming choice
for this is now up to administrators. See the "Notes -&gt; Fakebase directory"
section for more information. Throughout the rest of this document, you will
see $fakebase used in calls to the VFS, and /home used in actual paths.
<EM>You should always use $fakebase when making applications. </EM>I suggest
doing $fakebase = $phpgw-&gt;vfs-&gt;fakebase; right off the
bat to keep things neater.</P>
<H2><A NAME="ss4.1">4.1</A> <A HREF="vfs.html#toc4.1">What is it and how does it work?</A>
</H2>
<P>One of the design challenges for a Virtual File System is to try to figure
out whether the calling application is referring to a file inside or outside
the virtual root, and if inside, exactly where. To solve this problem, the
phpGroupWare VFS uses RELATIVE defines that are used in bitmasks passed to
each function. The result is that any set of different relativities can be
used in combination with each other. Let's look at a few examples. Say you
want to move "logo.png" from the user's home directory to the current directory.</P>
<P>
<PRE>
$phpgw-&gt;vfs-&gt;mv ("logo.png", "", array (RELATIVE_USER, RELATIVE_ALL));
</PRE>
</P>
<P>RELATIVE_USER means relative to the user's home directory. RELATIVE_ALL
means relative to the current directory, as set by cd () and as reported by
pwd (). So if the current directory was "$fakebase/my_group/project1",
the call to mv () would be processed as:</P>
<P>
<PRE>
MOVE "$fakebase/jason/logo.png" TO "$fakebase/my_group/project1/logo.png"
</PRE>
</P>
<P>and the actual file system call would be:</P>
<P>
<PRE>
rename ("/var/www/phpgroupware/files/home/jason/logo.php", "/var/www/phpgroupware/files/home/my_group/project1/logo.png");
</PRE>
</P>
<P>Those used to the old VFS will note that you do not have to translate the
path beforehand. Let's look at another example. Suppose you were moving an
email attachment stored in phpGroupWare's temporary directory to the "attachments"
directory within the user's home directory (we're assuming the attachments
directory exists). Note that the temporary directory is <EM>outside</EM> the virtual
root.</P>
<P>
<PRE>
$phpgw-&gt;vfs-&gt;mv ("$phpgw_info[server][temp_dir]/$randomdir/$randomfile", "attachments/actual_name.ext", array (RELATIVE_NONE|VFS_REAL, RELATIVE_USER));
</PRE>
</P>
<P>$randomdir and $randomfile are what the directory and file
might be called before they are given a proper name by the user, which is actual_name.ext
in this example. RELATIVE_NONE is the define for using full path names. However,
RELATIVE_NONE is still relative to the virtual root, so we pass along VFS_REAL
as well, to say that the file is <EM>outside</EM> the virtual root, somewhere else in
the file system. Once again, RELATIVE_USER means relative to the user's home
directory. So the actual file system call might look like this (keep in mind
that $randomdir and $randomfile are just random strings):</P>
<P>
<PRE>
rename ("/var/www/phpgroupware/tmp/0ak5adftgh7/jX42sC9M", "/var/www/phpgroupware/files/home/users/jason/attachments/actual_name.ext");
</PRE>
</P>
<P>Of course you don't have to know that, nor should you be concerned with
it; you can take it for granted that the VFS will translate the paths correctly.
Let's take a look at one more example, this time using the RELATIVE_USER_APP
define. RELATIVE_USER_APP is used to store quasi-hidden application files,
similar to the Unix convention of ~/.appname. It simply appends .appname
to the user's home directory. For example, if you were making an HTML editor
application named htmledit, and wanted to keep a backup file in case something
goes wrong, you would use RELATIVE_USER_APP to store it:</P>
<P>
<PRE>
$phpgw-&gt;vfs-&gt;write ("file.name~", array (RELATIVE_USER_APP), $contents);
</PRE>
</P>
<P>This assumes that ~/.htmledit exists of course. The backup file "file.name~"
would then be written in $fakebase/jason/.htmledit/file.name~.
Note that storing files like this might not be as good of a solution as storing
them in the temporary directory or in the database. But it is there in case
you need it.</P>
<H2><A NAME="sec:relatives_complete_list"></A> <A NAME="ss4.2">4.2</A> <A HREF="vfs.html#toc4.2">Complete List</A>
</H2>
<P>Here is the complete list of RELATIVE defines, and what they do:</P>
<P>
<DL>
<DT><B>RELATIVE_ROOT</B><DD><P>Don't translate the path at all. Just prepends a /.
You'll probably want to use RELATIVE_NONE though, which handles both virtual
and real files.</P>
<DT><B>RELATIVE_USER</B><DD><P>User's home directory</P>
<DT><B>RELATIVE_CURR_USER</B><DD><P>Current user's home directory. If the current
directory is $fakebase/my_group/project1, this will return is $fakebase/my_group</P>
<DT><B>RELATIVE_USER_APP</B><DD><P>Append .appname to the user's home directory, where
appname is the current application's appname</P>
<DT><B>RELATIVE_PATH</B><DD><P>DO NOT USE. Relative to the current directory, used
in RELATIVE_ALL</P>
<DT><B>RELATIVE_NONE</B><DD><P>Not relative to anything. Use this with VFS_REAL for
files outside the virtual root. Note that using RELATIVE_NONE by itself still
means relative to the virtual root</P>
<DT><B>RELATIVE_CURRENT</B><DD><P>An alias for the currently set RELATIVE define,
or RELATIVE_ALL if none is set (see the Defaults section)</P>
<DT><B>VFS_REAL</B><DD><P>File is outside of the virtual root. Usually used with RELATIVE_NONE</P>
<DT><B>RELATIVE_ALL</B><DD><P>Relative to the current directory. Use RELATIVE_ALL<EM></EM>instead of RELATIVE_PATH</P>
</DL>
</P>
<H2><A NAME="sec:relatives_defaults"></A> <A NAME="ss4.3">4.3</A> <A HREF="vfs.html#toc4.3">Defaults</A>
</H2>
<P>You might be thinking to yourself that passing along RELATIVE defines with
every VFS call is overkill, especially if your application always uses the
same relativity. The default RELATIVE define for all VFS calls is RELATIVE_CURRENT.
RELATIVE_CURRENT itself defaults to RELATIVE_ALL (relative to the current path),
<EM>unless</EM> your application sets a specific relativity. If your application requires
most of the work to be done outside of the virtual root, you may wish to set
RELATIVE_CURRENT to RELATIVE_NONE|VFS_REAL. set_relative () is the function
to do this. For example:</P>
<P>
<PRE>
$phpgw-&gt;vfs-&gt;set_relative (RELATIVE_NONE|VFS_REAL);
$phpgw-&gt;vfs-&gt;read ("/etc/passwd");
$phpgw-&gt;vfs-&gt;cp ("/usr/include/stdio.h", "/tmp/stdio.h");
$phpgw-&gt;vfs-&gt;cp ("/usr/share/pixmaps/yes.xpm", "icons/yes.xpm", array (RELATIVE_CURRENT, RELATIVE_USER));
</PRE>
</P>
<P>You should notice that no relativity array is needed in the other calls
that refer to files outside the virtual root, but one is needed for calls that
include files inside the virtual root. Any RELATIVE define can be set as the
default and works in the same fashion. To retrieve the currently set define,
use get_relative (). Note that the relativity is reset after each page request;
that is, it's good only for the life of the current page loading, and is not
stored in session management.</P>
<HR>
<A HREF="vfs-5.html">Next</A>
<A HREF="vfs-3.html">Previous</A>
<A HREF="vfs.html#toc4">Contents</A>
</BODY>
</HTML>

411
phpgwapi/doc/vfs/vfs-5.html Normal file
View File

@ -0,0 +1,411 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.7.4">
<TITLE>phpgwapi - VFS Class: Function reference</TITLE>
<LINK HREF="vfs-6.html" REL=next>
<LINK HREF="vfs-4.html" REL=previous>
<LINK HREF="vfs.html#toc5" REL=contents>
</HEAD>
<BODY>
<A HREF="vfs-6.html">Next</A>
<A HREF="vfs-4.html">Previous</A>
<A HREF="vfs.html#toc5">Contents</A>
<HR>
<H2><A NAME="sec:function_reference"></A> <A NAME="s5">5.</A> <A HREF="vfs.html#toc5">Function reference</A></H2>
<H2><A NAME="sec:function_reference_about"></A> <A NAME="ss5.1">5.1</A> <A HREF="vfs.html#toc5.1">About</A>
</H2>
<P>This function reference is periodically auto-generated from the inline
comments in phpgwapi/inc/class.vfs.inc.php. For the most up-to-date (and nicer
looking) reference, see class.vfs.inc.php. This reference is created as a separate
DocBook document (using the inline2lyx.pl script), so it might look a bit out
of place.</P>
<H2><A NAME="sec: class vfs"></A> <A NAME="ss5.2">5.2</A> <A HREF="vfs.html#toc5.2">class vfs</A>
</H2>
<P>abstract: virtual file system</P>
<P>description: Authors: Zone, Seek3r</P>
<H2><A NAME="sec: class path_class"></A> <A NAME="ss5.3">5.3</A> <A HREF="vfs.html#toc5.3">class path_class</A>
</H2>
<P>abstract: helper class for path_parts</P>
<H2><A NAME="sec: vfs"></A> <A NAME="ss5.4">5.4</A> <A HREF="vfs.html#toc5.4">vfs</A>
</H2>
<P>abstract: constructor, sets up variables</P>
<P>
<PRE>
function vfs ()
</PRE>
</P>
<H2><A NAME="sec: set_relative"></A> <A NAME="ss5.5">5.5</A> <A HREF="vfs.html#toc5.5">set_relative</A>
</H2>
<P>abstract: Set path relativity</P>
<P>param: $mask Relative bitmask (see RELATIVE_ defines)</P>
<P>
<PRE>
function set_relative ($mask)
</PRE>
</P>
<H2><A NAME="sec: get_relative"></A> <A NAME="ss5.6">5.6</A> <A HREF="vfs.html#toc5.6">get_relative</A>
</H2>
<P>abstract: Return relativity bitmask</P>
<P>discussion: Returns relativity bitmask, or the default of &quot;completely
relative&quot; if unset</P>
<P>
<PRE>
function get_relative ()
</PRE>
</P>
<H2><A NAME="sec: sanitize"></A> <A NAME="ss5.7">5.7</A> <A HREF="vfs.html#toc5.7">sanitize</A>
</H2>
<P>abstract: Removes leading .'s from $string</P>
<P>discussion: You should not pass all filenames through sanitize () unless
you plan on rejecting</P>
<P>.files. Instead, pass the name through securitycheck () first, and if
it fails,</P>
<P>pass it through sanitize</P>
<P>param: $string string to sanitize</P>
<P>result: $string without it's leading .'s</P>
<P>
<PRE>
function sanitize ($string)
</PRE>
</P>
<H2><A NAME="sec: securitycheck"></A> <A NAME="ss5.8">5.8</A> <A HREF="vfs.html#toc5.8">securitycheck</A>
</H2>
<P>abstract: Security check function</P>
<P>discussion: Checks for basic violations such as ..</P>
<P>If securitycheck () fails, run your string through vfs-&gt;sanitize ()</P>
<P>param: $string string to check security of</P>
<P>result: Boolean True/False. True means secure, False means insecure</P>
<P>
<PRE>
function securitycheck ($string)
</PRE>
</P>
<H2><A NAME="sec: db_clean"></A> <A NAME="ss5.9">5.9</A> <A HREF="vfs.html#toc5.9">db_clean</A>
</H2>
<P>abstract: Clean $string for use in database queries</P>
<P>param: $string String to clean</P>
<P>result: Cleaned version of $string</P>
<P>
<PRE>
function db_clean ($string)
</PRE>
</P>
<H2><A NAME="sec: path_parts"></A> <A NAME="ss5.10">5.10</A> <A HREF="vfs.html#toc5.10">path_parts</A>
</H2>
<P>abstract: take a real or fake pathname and return an array of its component
parts</P>
<P>param: $string full real or fake path</P>
<P>param: $relatives Relativity array</P>
<P>param: $object True returns an object instead of an array</P>
<P>result: $rarray/$robject Array or object containing the fake
and real component parts of the path</P>
<P>discussion: Returned values are:</P>
<P>mask</P>
<P>outside</P>
<P>fake_full_path</P>
<P>fake_leading_dirs</P>
<P>fake_extra_path</P>
<P>fake_name</P>
<P>real_full_path</P>
<P>real_leading_dirs</P>
<P>real_extra_path</P>
<P>real_name</P>
<P>fake_full_path_clean</P>
<P>fake_leading_dirs_clean</P>
<P>fake_extra_path_clean</P>
<P>fake_name_clean</P>
<P>real_full_path_clean</P>
<P>real_leading_dirs_clean</P>
<P>real_extra_path_clean</P>
<P>real_name_clean</P>
<P>&quot;clean&quot; values are run through vfs-&gt;db_clean () and</P>
<P>are safe for use in SQL queries that use key='value'</P>
<P>They should be used ONLY for SQL queries, so are used</P>
<P>mostly internally</P>
<P>mask is either RELATIVE_NONE or RELATIVE_NONE|VFS_REAL,</P>
<P>and is used internally</P>
<P>outside is boolean, True if $relatives contains VFS_REAL</P>
<P>
<PRE>
function path_parts ($string, $relatives = array (RELATIVE_CURRENT), $object = True)
</PRE>
</P>
<H2><A NAME="sec: getabsolutepath"></A> <A NAME="ss5.11">5.11</A> <A HREF="vfs.html#toc5.11">getabsolutepath</A>
</H2>
<P>abstract: get the absolute path</P>
<P>param: $target defaults to False, directory/file to get path of,
relative to $relatives[0]</P>
<P>param: $mask Relativity bitmask (see RELATIVE_ defines). RELATIVE_CURRENT
means use $this-&gt;relative</P>
<P>param: $fake Returns the &quot;fake&quot; path, ie /home/user/dir/file
(not always possible. use path_parts () instead)</P>
<P>result: $basedir Full fake or real path</P>
<P>
<PRE>
function getabsolutepath ($target = False, $relatives = array (RELATIVE_CURRENT), $fake = True)
</PRE>
</P>
<H2><A NAME="sec: cd"></A> <A NAME="ss5.12">5.12</A> <A HREF="vfs.html#toc5.12">cd</A>
</H2>
<P>abstract: Change directory</P>
<P>discussion: To cd to the files root &quot;/&quot;, use cd (&quot;/&quot;,
False, array (RELATIVE_NONE));</P>
<P>param: $target default &quot;/&quot;. directory to cd into. if
&quot;/&quot; and $relative is True, uses &quot;/home/&lt;working_lid&gt;&quot;;</P>
<P>param: $relative default True/relative means add target to current
path, else pass $relative as mask to getabsolutepath()</P>
<P>
<PRE>
function cd ($target = &quot;/&quot;, $relative = True, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: pwd"></A> <A NAME="ss5.13">5.13</A> <A HREF="vfs.html#toc5.13">pwd</A>
</H2>
<P>abstract: current working dir</P>
<P>param: $full default True returns full fake path, else just the
extra dirs (false strips the leading /)</P>
<P>result: $currentdir currentdir</P>
<P>
<PRE>
function pwd ($full = True)
</PRE>
</P>
<H2><A NAME="sec: read"></A> <A NAME="ss5.14">5.14</A> <A HREF="vfs.html#toc5.14">read</A>
</H2>
<P>abstract: return file contents</P>
<P>param: $file filename</P>
<P>param: $relatives Relativity array</P>
<P>result: $contents Contents of $file, or False if file cannot
be read</P>
<P>
<PRE>
function read ($file, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: write"></A> <A NAME="ss5.15">5.15</A> <A HREF="vfs.html#toc5.15">write</A>
</H2>
<P>abstract: write to a file</P>
<P>param: $file file name</P>
<P>param: $relatives Relativity array</P>
<P>param: $contents contents</P>
<P>result: Boolean True/False</P>
<P>
<PRE>
function write ($file, $relatives = array (RELATIVE_CURRENT), $contents)
</PRE>
</P>
<H2><A NAME="sec: touch"></A> <A NAME="ss5.16">5.16</A> <A HREF="vfs.html#toc5.16">touch</A>
</H2>
<P>abstract: Create blank file $file or set the modification time and
modified by of $file to current time and user</P>
<P>param: $file File to touch or set modifies</P>
<P>param: $relatives Relativity array</P>
<P>result: Boolean True/False</P>
<P>
<PRE>
function touch ($file, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: cp"></A> <A NAME="ss5.17">5.17</A> <A HREF="vfs.html#toc5.17">cp</A>
</H2>
<P>abstract: copy file</P>
<P>param: $from from file/directory</P>
<P>param: $to to file/directory</P>
<P>param: $relatives Relativity array</P>
<P>result: boolean True/False</P>
<P>
<PRE>
function cp ($from, $to, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: mv"></A> <A NAME="ss5.18">5.18</A> <A HREF="vfs.html#toc5.18">mv</A>
</H2>
<P>abstract: move file/directory</P>
<P>param: $from from file/directory</P>
<P>param: $to to file/directory</P>
<P>param: $relatives Relativity array</P>
<P>result: boolean True/False</P>
<P>
<PRE>
function mv ($from, $to, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: move"></A> <A NAME="ss5.19">5.19</A> <A HREF="vfs.html#toc5.19">move</A>
</H2>
<P>abstract: shortcut to mv</P>
<P>
<PRE>
function move ($from, $to, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: rm"></A> <A NAME="ss5.20">5.20</A> <A HREF="vfs.html#toc5.20">rm</A>
</H2>
<P>abstract: delete file/directory</P>
<P>param: $string file/directory to delete</P>
<P>param: $relatives Relativity array</P>
<P>result: boolean True/False</P>
<P>
<PRE>
function rm ($string, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: delete"></A> <A NAME="ss5.21">5.21</A> <A HREF="vfs.html#toc5.21">delete</A>
</H2>
<P>abstract: shortcut to rm</P>
<P>
<PRE>
function delete ($string, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: mkdir"></A> <A NAME="ss5.22">5.22</A> <A HREF="vfs.html#toc5.22">mkdir</A>
</H2>
<P>abstract: make a new directory</P>
<P>param: $dir Directory name</P>
<P>param: $relatives Relativity array</P>
<P>result: boolean True on success</P>
<P>
<PRE>
function mkdir ($dir, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: set_attributes"></A> <A NAME="ss5.23">5.23</A> <A HREF="vfs.html#toc5.23">set_attributes</A>
</H2>
<P>abstract: Update database entry for $file with the attributes in
$attributes</P>
<P>param: $file file/directory to update</P>
<P>param: $relatives Relativity array</P>
<P>param: $attributes keyed array of attributes. key is attribute
name, value is attribute value</P>
<P>result: Boolean True/False</P>
<P>discussion: Valid attributes are:</P>
<P>owner_id</P>
<P>createdby_id</P>
<P>modifiedby_id</P>
<P>created</P>
<P>modified</P>
<P>size</P>
<P>mime_type</P>
<P>deleteable</P>
<P>comment</P>
<P>app</P>
<P>
<PRE>
function set_attributes ($file, $relatives = array (RELATIVE_CURRENT), $attributes = array ())
</PRE>
</P>
<H2><A NAME="sec: correct_attributes"></A> <A NAME="ss5.24">5.24</A> <A HREF="vfs.html#toc5.24">correct_attributes</A>
</H2>
<P>abstract: Set the correct attributes for $string (e.g. owner)</P>
<P>param: $string File/directory to correct attributes of</P>
<P>param: $relatives Relativity array</P>
<P>result: Boolean True/False</P>
<P>
<PRE>
function correct_attributes ($string, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: file_type"></A> <A NAME="ss5.25">5.25</A> <A HREF="vfs.html#toc5.25">file_type</A>
</H2>
<P>abstract: return file/dir type (MIME or other)</P>
<P>param: $file File or directory path (/home/user/dir/dir2/dir3, /home/user/dir/dir2/file)</P>
<P>param: $relatives Relativity array</P>
<P>result: MIME type, &quot;Directory&quot;, or nothing if MIME type is not
known</P>
<P>
<PRE>
function file_type ($file, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: file_exists"></A> <A NAME="ss5.26">5.26</A> <A HREF="vfs.html#toc5.26">file_exists</A>
</H2>
<P>abstract: check if file/directory exists</P>
<P>param: $string file/directory to check existance of</P>
<P>param: $relatives Relativity array</P>
<P>result: Boolean True/False</P>
<P>
<PRE>
function file_exists ($string, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: checkperms"></A> <A NAME="ss5.27">5.27</A> <A HREF="vfs.html#toc5.27">checkperms</A>
</H2>
<P>abstract: Check if you have write access to create files in $dir</P>
<P>discussion: This isn't perfect, because vfs-&gt;touch () returns True even</P>
<P>if only the database entry worked. ACLs need to be</P>
<P>implemented for better permission checking. It's</P>
<P>also pretty slow, so I wouldn't recommend using it</P>
<P>often</P>
<P>param: $dir Directory to check access of</P>
<P>param: $relatives Relativity array</P>
<P>result: Boolean True/False</P>
<P>
<PRE>
function checkperms ($dir, $relatives = array (RELATIVE_CURRENT))
</PRE>
</P>
<H2><A NAME="sec: ls"></A> <A NAME="ss5.28">5.28</A> <A HREF="vfs.html#toc5.28">ls</A>
</H2>
<P>abstract: get directory listing</P>
<P>discussion: Note: the entries are not guaranteed to be returned in any
logical order</P>
<P>param: $dir Directory</P>
<P>param: $relatives Relativity array</P>
<P>param: $checksubdirs Boolean, recursively list all sub directories
as well?</P>
<P>param: $mime_type Only return entries matching MIME-type $mime_type.
Can be &quot;Directory&quot; or &quot;\&quot; for those without MIME
types</P>
<P>param: $nofiles Boolean. True means you want to return just the
information about the directory $dir. If $dir is a file, $nofiles
is implied. This is the equivalent of 'ls -ld $dir'</P>
<P>result: array of arrays. Subarrays contain full info for each file/dir.</P>
<P>
<PRE>
function ls ($dir = False, $relatives = array (RELATIVE_CURRENT), $checksubdirs = True, $mime_type = False, $nofiles = False)
</PRE>
</P>
<H2><A NAME="sec: dir"></A> <A NAME="ss5.29">5.29</A> <A HREF="vfs.html#toc5.29">dir</A>
</H2>
<P>abstract: shortcut to ls</P>
<P>
<PRE>
function dir ($dir = False, $relatives = array (RELATIVE_CURRENT), $checksubdirs = True, $mime_type = False, $nofiles = False)
</PRE>
</P>
<HR>
<A HREF="vfs-6.html">Next</A>
<A HREF="vfs-4.html">Previous</A>
<A HREF="vfs.html#toc5">Contents</A>
</BODY>
</HTML>

130
phpgwapi/doc/vfs/vfs-6.html Normal file
View File

@ -0,0 +1,130 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.7.4">
<TITLE>phpgwapi - VFS Class: Notes</TITLE>
<LINK HREF="vfs-5.html" REL=previous>
<LINK HREF="vfs.html#toc6" REL=contents>
</HEAD>
<BODY>
Next
<A HREF="vfs-5.html">Previous</A>
<A HREF="vfs.html#toc6">Contents</A>
<HR>
<H2><A NAME="sec:notes"></A> <A NAME="s6">6.</A> <A HREF="vfs.html#toc6">Notes</A></H2>
<H2><A NAME="sec:database"></A> <A NAME="ss6.1">6.1</A> <A HREF="vfs.html#toc6.1">Database</A>
</H2>
<P>Data about the files and directories within the virtual root is kept in
the SQL database. Currently, this information includes:</P>
<P>
<UL>
<LI>File ID (used internally, primary key for table)</LI>
<LI>Owner ID (phpGW account_id)</LI>
<LI>Created by ID (phpGW account_id)</LI>
<LI>Modified by ID (phpGW account_id)</LI>
<LI>Created (date)</LI>
<LI>Modified (date)</LI>
<LI>Size (bytes)</LI>
<LI>MIME type</LI>
<LI>Deleteable (Y/N/Other?)</LI>
<LI>Comment</LI>
<LI>App (appname of application that created the file)</LI>
<LI>Directory (directory the file or directory is in)</LI>
<LI>Name (name of file or directory)</LI>
</UL>
</P>
<P>The internal names of these (the database column names) are stored in the
$phpgw-&gt;vfs-&gt;attributes array, which is useful for loops, and
is guaranteed to be up-to-date.</P>
<P>Note that no information is kept about files outside the virtual root.
If a file is moved outside, all records of it are delete from the database.
If a file is moved into the virtual root, some information, specifically MIME-type,
is not stored in the database. The vital information has defaults: owner is
based on where the file is being stored; size is correctly read; deleteable
is set to Y.</P>
<H2><A NAME="sec:acl_support"></A> <A NAME="ss6.2">6.2</A> <A HREF="vfs.html#toc6.2">ACL support</A>
</H2>
<P>Because of the many different ways the VFS can be used, complete ACL support
is not built in. There is a bit of access control built in, just because of
the way database queries are made. However, that is a discussion beyond the
scope of this document. Full ACL support may be added at a later time. For
now, it is fairly easy to add basic access control to your application by matching
path expressions. The VFS always follows the same naming convention of $fakebase/userorgroup.
So if you need to check if a user has access to $fakebase/whatever/dir/file,
you need only know if they their username is 'whatever' or if they belong to
the group 'whatever', and that the group has access to your application. Here
is an example from PHPWebHosting:</P>
<P>
<PRE>
###
# First we get their memberships
###
$memberships = $phpgw-&gt;accounts-&gt;memberships ($account_id);
###
# We determine if they're in their home directory or a group's directory
# If they request a group's directory, we ensure they have access to the group,
# and the group has access to the app
###
if ((preg_match (&quot;+^$fakebase\/(.*)(\/|$)+U&quot;, $path, $matches)) &amp;&amp; $matches[1] != $account_lid)
{
$phpgw-&gt;vfs-&gt;working_id = $phpgw-&gt;accounts-&gt;name2id ($matches[1]);
reset ($memberships);
while (list ($num, $group_array) = each ($memberships))
{
if ($matches[1] == $group_array[&quot;account_name&quot;])
{
$group_ok = 1;
break;
}
}
if (!$group_ok)
{
echo $phpgw-&gt;common-&gt;error_list (array (&quot;You do not have access to group/directory $matches[1]&quot;));
exit;
}
}
</PRE>
</P>
<P>You should also check if the group has access to your appilcation.</P>
<H2><A NAME="sec:function_aliases"></A> <A NAME="ss6.3">6.3</A> <A HREF="vfs.html#toc6.3">Function aliases</A>
</H2>
<P>You might have noticed there are some functions that just pass the arguments
on to other functions. These are provided in part because of legacy and in
part for convenience. You can use either. Here is the list (alias -&gt; actual):</P>
<P>
<UL>
<LI>copy -&gt; cp</LI>
<LI>move -&gt; rm</LI>
<LI>delete -&gt; rm</LI>
<LI>dir -&gt; ls</LI>
</UL>
</P>
<H2><A NAME="sec:fakebase"></A> <A NAME="ss6.4">6.4</A> <A HREF="vfs.html#toc6.4">Fakebase directory (changing /home)</A>
</H2>
<P>The old VFS was hard-coded to use &quot;/home&quot; as the fake base directory,
even though the user never saw it. With the new system, crafty administrators
may wish to change &quot;/home&quot; to something else, say &quot;/users&quot;
or &quot;/public_html&quot;. The fake base directory name is stored in $phpgw-&gt;vfs-&gt;fakebase,
and changing it will transparently change it throughout the VFS and all applications.
However, this must be done <EM>before</EM> any data is in the VFS database. If you wish
to change it afterwords, you'll have to manually update the database, replacing
the old value with the new value. <EM>Application programmers need to recognize
that /home is not absolute, and use $phpgw-&gt;vfs-&gt;fakebase instead</EM>.
I suggest setting $fakebase = $phpgw-&gt;vfs-&gt;fakebase; right
off the bat to keep things neater.</P>
<HR>
Next
<A HREF="vfs-5.html">Previous</A>
<A HREF="vfs.html#toc6">Contents</A>
</BODY>
</HTML>

94
phpgwapi/doc/vfs/vfs.html Normal file
View File

@ -0,0 +1,94 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.7.4">
<TITLE>phpgwapi - VFS Class</TITLE>
<LINK HREF="vfs-1.html" REL=next>
</HEAD>
<BODY>
<A HREF="vfs-1.html">Next</A>
Previous
Contents
<HR>
<H1>phpgwapi - VFS Class</H1>
<H2>Jason Wies</H2>June 2001
<HR>
<EM>The VFS, or Virtual File System, handles all file system activity for phpGroupWare.</EM>
<HR>
<P>
<H2><A NAME="toc1">1.</A> <A HREF="vfs-1.html">Introduction and Purpose</A></H2>
<P>
<H2><A NAME="toc2">2.</A> <A HREF="vfs-2.html">Basics</A></H2>
<UL>
<LI><A NAME="toc2.1">2.1</A> <A HREF="vfs-2.html#ss2.1">Prerequisites</A>
<LI><A NAME="toc2.2">2.2</A> <A HREF="vfs-2.html#ss2.2">Concepts</A>
</UL>
<P>
<H2><A NAME="toc3">3.</A> <A HREF="vfs-3.html">Basic Functions</A></H2>
<UL>
<LI><A NAME="toc3.1">3.1</A> <A HREF="vfs-3.html#ss3.1">path_parts ()</A>
<LI><A NAME="toc3.2">3.2</A> <A HREF="vfs-3.html#ss3.2">cd ()</A>
</UL>
<P>
<H2><A NAME="toc4">4.</A> <A HREF="vfs-4.html">Relativity</A></H2>
<UL>
<LI><A NAME="toc4.1">4.1</A> <A HREF="vfs-4.html#ss4.1">What is it and how does it work?</A>
<LI><A NAME="toc4.2">4.2</A> <A HREF="vfs-4.html#ss4.2">Complete List</A>
<LI><A NAME="toc4.3">4.3</A> <A HREF="vfs-4.html#ss4.3">Defaults</A>
</UL>
<P>
<H2><A NAME="toc5">5.</A> <A HREF="vfs-5.html">Function reference</A></H2>
<UL>
<LI><A NAME="toc5.1">5.1</A> <A HREF="vfs-5.html#ss5.1">About</A>
<LI><A NAME="toc5.2">5.2</A> <A HREF="vfs-5.html#ss5.2">class vfs</A>
<LI><A NAME="toc5.3">5.3</A> <A HREF="vfs-5.html#ss5.3">class path_class</A>
<LI><A NAME="toc5.4">5.4</A> <A HREF="vfs-5.html#ss5.4">vfs</A>
<LI><A NAME="toc5.5">5.5</A> <A HREF="vfs-5.html#ss5.5">set_relative</A>
<LI><A NAME="toc5.6">5.6</A> <A HREF="vfs-5.html#ss5.6">get_relative</A>
<LI><A NAME="toc5.7">5.7</A> <A HREF="vfs-5.html#ss5.7">sanitize</A>
<LI><A NAME="toc5.8">5.8</A> <A HREF="vfs-5.html#ss5.8">securitycheck</A>
<LI><A NAME="toc5.9">5.9</A> <A HREF="vfs-5.html#ss5.9">db_clean</A>
<LI><A NAME="toc5.10">5.10</A> <A HREF="vfs-5.html#ss5.10">path_parts</A>
<LI><A NAME="toc5.11">5.11</A> <A HREF="vfs-5.html#ss5.11">getabsolutepath</A>
<LI><A NAME="toc5.12">5.12</A> <A HREF="vfs-5.html#ss5.12">cd</A>
<LI><A NAME="toc5.13">5.13</A> <A HREF="vfs-5.html#ss5.13">pwd</A>
<LI><A NAME="toc5.14">5.14</A> <A HREF="vfs-5.html#ss5.14">read</A>
<LI><A NAME="toc5.15">5.15</A> <A HREF="vfs-5.html#ss5.15">write</A>
<LI><A NAME="toc5.16">5.16</A> <A HREF="vfs-5.html#ss5.16">touch</A>
<LI><A NAME="toc5.17">5.17</A> <A HREF="vfs-5.html#ss5.17">cp</A>
<LI><A NAME="toc5.18">5.18</A> <A HREF="vfs-5.html#ss5.18">mv</A>
<LI><A NAME="toc5.19">5.19</A> <A HREF="vfs-5.html#ss5.19">move</A>
<LI><A NAME="toc5.20">5.20</A> <A HREF="vfs-5.html#ss5.20">rm</A>
<LI><A NAME="toc5.21">5.21</A> <A HREF="vfs-5.html#ss5.21">delete</A>
<LI><A NAME="toc5.22">5.22</A> <A HREF="vfs-5.html#ss5.22">mkdir</A>
<LI><A NAME="toc5.23">5.23</A> <A HREF="vfs-5.html#ss5.23">set_attributes</A>
<LI><A NAME="toc5.24">5.24</A> <A HREF="vfs-5.html#ss5.24">correct_attributes</A>
<LI><A NAME="toc5.25">5.25</A> <A HREF="vfs-5.html#ss5.25">file_type</A>
<LI><A NAME="toc5.26">5.26</A> <A HREF="vfs-5.html#ss5.26">file_exists</A>
<LI><A NAME="toc5.27">5.27</A> <A HREF="vfs-5.html#ss5.27">checkperms</A>
<LI><A NAME="toc5.28">5.28</A> <A HREF="vfs-5.html#ss5.28">ls</A>
<LI><A NAME="toc5.29">5.29</A> <A HREF="vfs-5.html#ss5.29">dir</A>
</UL>
<P>
<H2><A NAME="toc6">6.</A> <A HREF="vfs-6.html">Notes</A></H2>
<UL>
<LI><A NAME="toc6.1">6.1</A> <A HREF="vfs-6.html#ss6.1">Database</A>
<LI><A NAME="toc6.2">6.2</A> <A HREF="vfs-6.html#ss6.2">ACL support</A>
<LI><A NAME="toc6.3">6.3</A> <A HREF="vfs-6.html#ss6.3">Function aliases</A>
<LI><A NAME="toc6.4">6.4</A> <A HREF="vfs-6.html#ss6.4">Fakebase directory (changing /home)</A>
</UL>
<HR>
<A HREF="vfs-1.html">Next</A>
Previous
Contents
</BODY>
</HTML>

1933
phpgwapi/doc/vfs/vfs.lyx Normal file

File diff suppressed because it is too large Load Diff

1148
phpgwapi/doc/vfs/vfs.sgml Normal file

File diff suppressed because it is too large Load Diff

910
phpgwapi/doc/vfs/vfs.txt Normal file
View File

@ -0,0 +1,910 @@
phpgwapi - VFS Class
Jason Wies
June 2001
Abstract
The VFS, or Virtual File System, handles all file system activity for
phpGroupWare.
1 Introduction and Purpose<sec:introduction>
The latest version of the VFS for phpGroupWare combines actual file
system manipulation with fully integrated database support. It features
nearly transparent handling of files and directories, as well as files
inside and outside the virtual root. This document is intended to
provide API and application developers with a guide to incorporating
the VFS into their work.
2 Basics<sec:basics>
2.1 Prerequisites<sec:prerequisites>
You must explicitly enable the VFS class. To do this, set "enable_vfs_class"
to True in $phpgw_info["flags"]. An example:
$phpgw_info["flags"] = array("currentapp" => "phpwebhosting",
"noheader" => False,
"noappheader" => False,
"enable_vfs_class" => True,
"enable_browser_class" => True);
2.2 Concepts<sec:concepts>
The VFS in located in phpgwapi/inc/class.vfs.inc.php. You can look
over it, but I don't suggest trying to understand how it works. It
isn't necessary to know its internals to use it, but you may find
the inline comments helpful. The basic things to keep in mind:
* Files and directories are synonymous in almost all cases
$phpgw->vfs->mv ("file1", "dir/file2");
$phpgw->vfs->mv ("dir1", "dir/dir1");
$phpgw->vfs->rm ("file");
$phpgw->vfs->rm ("dir");
All work as you would except them to. The major exception is:
$phpgw->vfs->touch ("file");
vs.
$phpgw->vfs->mkdir ("dir");
* Users and groups and synonymous
As far as the actual paths are concerned, users and groups are the
same. The VFS has no built in ACL support, so /home/username works
the same as /home/groupname. See the note on AC L support in the Notes
section.
* You should never have to know the real path of files
One of the VFS's responsibilities is to translate paths for you. While
you certainly can operate using full paths, it is much simpler to
use the virtual paths. For example, instead of using:
$phpgw->vfs->cp ("/var/www/phpgroupware/files/home/user/file1", "/var/www/phpgroupware/files/home/user/file2",
array (RELATIVE_NONE|VFS_REAL, RELATIVE_NONE|VFS_REAL));
you might use
$phpgw->vfs->cp ("/home/user/file1", "/home/user/file2", array (RELATIVE_NONE,
RELATIVE_NONE));
(We'll get to the RELATIVE's in a minute.)
Site administrators should be able to move their files dir around on
their system and know that everything will continue to work smoothly.
* Relativity is vital
Relativity is a new feature in the VFS, and its importance cannot be
stressed enough. It will make your life much easier, especially for
file system intensive applications, but it will take some getting
used to. If something doesn't work right the first time, chances are
great it has to do with incorrect relativity settings. We will deal
with relativity in depth in the Relativity section.
3 Basic Functions<sec:basic_functions>
These are two functions you'll need to know before we get into relativity.
3.1 path_parts ()<sec:path_parts>
The job of path_parts () is to translate any given file location into
its many component parts for any relativity. The prototype for path_parts
() is:
function path_parts ($string, $relatives = array (RELATIVE_CURRENT),
$object = True)
$string is the path you want to translate, $relatives is the standard
relativity array, and $object specifies how you would like the return
value: if $object is True, an object will be returned; if $object
is False, an array will be returned. I think you'll find the object
easier to deal with, and we'll be using it throughout this document.
The most important returned values (but not all) for path_parts ()
are:
fake_full_path
fake_leading_dirs
fake_extra_path
fake_name
real_full_path
real_leading_dirs
real_extra_path
real_name
Just like you would think, fake_full_path contains the full virtual
path of $string, and real_full_path contains the full real path of
$string. The fake_name and real_name variables should always be the
same, and contain the final file or directory name. The leading_dirs
contain everything except the name, and the extra_path is everything
from the / before "home" to the end of the leading_dirs. To better
illustrate, here is an example:
$p = $phpgw->vfs->path_parts ("/home/jason/dir/file", array (RELATIVE_NONE));
* $p->fake_full_path - /home/jason/dir/file
* $p->fake_leading_dirs - /home/jason/dir
* $p->fake_extra_path - home/jason/dir
* $p->fake_name - file
* $p->real_full_path - /var/www/phpgroupware/files/home/jason/dir/file
* $p->real_leading_dirs - /var/www/phpgroupware/files/home/jason/dir
* $p->real_extra_path - home/jason/dir
* $p->real_name - file
As you can see, path_parts () is a very useful function and will save
you from doing those darn substr ()'s yourself. For those of you used
to the prior VFS, note that getabsolutepath () is depreciated. getabsolutepath
() still exists (albeit in a much different form), and is responsible
for some of the path translation, but it is an internal function only.
Applications should only use path_parts (). We have shown you how
to use path_parts () so you can experiment with it using different
paths and relativities as we relativity in Section [sec:relativity].
3.2 cd ()<sec:cd>
Ok, one more thing before we discuss relativity, and that is the cd
() function. Part of the overall goal for the VFS in phpGroupWare
is to give the user a seamless experience during their session. For
example, if they upload a file using a file manager to /home/my_group/project1,
and then go to download an email attachment, the default directory
will be /home/my_group/project1. This is accomplished using the cd
() function. The prototype and examples:
function cd ($target = "/", $relative = True, $relatives = array (RELATIVE_CURRENT))
$phpgw->vfs->cd ("/"); /* cd to their home directory */
$phpgw->vfs->cd ("/home/jason/dir", False, array (RELATIVE_NONE));
/* cd to /home/jason/dir */
$phpgw->vfs->cd ("dir2", True); /* When following the above, cd's to
/home/jason/dir/dir2 */
If $relatives is True, the $target is simply appended to the current
path. If you want to know what the current path is, use $phpgw->vfs->pwd
().
Now you're ready for relativity.
4 Relativity<sec:relativity>
Ok, just one last thing before we get into relativity. You will notice
throughout the examples the use of $fakebase. $fakebase is by default
"/home". The old VFS was hard-coded to use "/home", but the naming
choice for this is now up to administrators. See the "Notes -> Fakebase
directory" section for more information. Throughout the rest of this
document, you will see $fakebase used in calls to the VFS, and /home
used in actual paths. You should always use $fakebase when making
applications. I suggest doing $fakebase = $phpgw->vfs->fakebase; right
off the bat to keep things neater.
4.1 What is it and how does it work?
One of the design challenges for a Virtual File System is to try to
figure out whether the calling application is referring to a file
inside or outside the virtual root, and if inside, exactly where.
To solve this problem, the phpGroupWare VFS uses RELATIVE defines
that are used in bitmasks passed to each function. The result is that
any set of different relativities can be used in combination with
each other. Let's look at a few examples. Say you want to move "logo.png"
from the user's home directory to the current directory.
$phpgw->vfs->mv ("logo.png", "", array (RELATIVE_USER, RELATIVE_ALL));
RELATIVE_USER means relative to the user's home directory. RELATIVE_ALL
means relative to the current directory, as set by cd () and as reported
by pwd (). So if the current directory was "$fakebase/my_group/project1",
the call to mv () would be processed as:
MOVE "$fakebase/jason/logo.png" TO "$fakebase/my_group/project1/logo.png"
and the actual file system call would be:
rename ("/var/www/phpgroupware/files/home/jason/logo.php", "/var/www/phpgroupware/files/home/my_group/project1/logo.png");
Those used to the old VFS will note that you do not have to translate
the path beforehand. Let's look at another example. Suppose you were
moving an email attachment stored in phpGroupWare's temporary directory
to the "attachments" directory within the user's home directory (we're
assuming the attachments directory exists). Note that the temporary
directory is outside the virtual root.
$phpgw->vfs->mv ("$phpgw_info[server][temp_dir]/$randomdir/$randomfile",
"attachments/actual_name.ext", array (RELATIVE_NONE|VFS_REAL, RELATIVE_USER));
$randomdir and $randomfile are what the directory and file might be
called before they are given a proper name by the user, which is actual_name.ext
in this example. RELATIVE_NONE is the define for using full path names.
However, RELATIVE_NONE is still relative to the virtual root, so we
pass along VFS_REAL as well, to say that the file is outside the virtual
root, somewhere else in the file system. Once again, RELATIVE_USER
means relative to the user's home directory. So the actual file system
call might look like this (keep in mind that $randomdir and $randomfile
are just random strings):
rename ("/var/www/phpgroupware/tmp/0ak5adftgh7/jX42sC9M", "/var/www/phpgroupware/files/home/users/jason/attachments/actual_name.ext");
Of course you don't have to know that, nor should you be concerned
with it; you can take it for granted that the VFS will translate the
paths correctly. Let's take a look at one more example, this time
using the RELATIVE_USER_APP define. RELATIVE_USER_APP is used to store
quasi-hidden application files, similar to the Unix convention of
~/.appname. It simply appends .appname to the user's home directory.
For example, if you were making an HTML editor application named htmledit,
and wanted to keep a backup file in case something goes wrong, you
would use RELATIVE_USER_APP to store it:
$phpgw->vfs->write ("file.name~", array (RELATIVE_USER_APP), $contents);
This assumes that ~/.htmledit exists of course. The backup file "file.name~"
would then be written in $fakebase/jason/.htmledit/file.name~. Note
that storing files like this might not be as good of a solution as
storing them in the temporary directory or in the database. But it
is there in case you need it.
4.2 Complete List<sec:relatives_complete_list>
Here is the complete list of RELATIVE defines, and what they do:
RELATIVE_ROOT Don't translate the path at all. Just prepends a /.
You'll probably want to use RELATIVE_NONE though, which handles
both virtual and real files.
RELATIVE_USER User's home directory
RELATIVE_CURR_USER Current user's home directory. If the current
directory is $fakebase/my_group/project1, this will return is $fakebase/my_group
RELATIVE_USER_APP Append .appname to the user's home directory, where
appname is the current application's appname
RELATIVE_PATH DO NOT USE. Relative to the current directory, used
in RELATIVE_ALL
RELATIVE_NONE Not relative to anything. Use this with VFS_REAL for
files outside the virtual root. Note that using RELATIVE_NONE by
itself still means relative to the virtual root
RELATIVE_CURRENT An alias for the currently set RELATIVE define,
or RELATIVE_ALL if none is set (see the Defaults section)
VFS_REAL File is outside of the virtual root. Usually used with RELATIVE_NONE
RELATIVE_ALL Relative to the current directory. Use RELATIVE_ALL
instead of RELATIVE_PATH
4.3 Defaults<sec:relatives_defaults>
You might be thinking to yourself that passing along RELATIVE defines
with every VFS call is overkill, especially if your application always
uses the same relativity. The default RELATIVE define for all VFS
calls is RELATIVE_CURRENT. RELATIVE_CURRENT itself defaults to RELATIVE_ALL
(relative to the current path), unless your application sets a specific
relativity. If your application requires most of the work to be done
outside of the virtual root, you may wish to set RELATIVE_CURRENT
to RELATIVE_NONE|VFS_REAL. set_relative () is the function to do this.
For example:
$phpgw->vfs->set_relative (RELATIVE_NONE|VFS_REAL);
$phpgw->vfs->read ("/etc/passwd");
$phpgw->vfs->cp ("/usr/include/stdio.h", "/tmp/stdio.h");
$phpgw->vfs->cp ("/usr/share/pixmaps/yes.xpm", "icons/yes.xpm", array
(RELATIVE_CURRENT, RELATIVE_USER));
You should notice that no relativity array is needed in the other calls
that refer to files outside the virtual root, but one is needed for
calls that include files inside the virtual root. Any RELATIVE define
can be set as the default and works in the same fashion. To retrieve
the currently set define, use get_relative (). Note that the relativity
is reset after each page request; that is, it's good only for the
life of the current page loading, and is not stored in session management.
5 Function reference<sec:function_reference>
5.1 About<sec:function_reference_about>
This function reference is periodically auto-generated from the inline
comments in phpgwapi/inc/class.vfs.inc.php. For the most up-to-date
(and nicer looking) reference, see class.vfs.inc.php. This reference
is created as a separate DocBook document (using the inline2lyx.pl
script), so it might look a bit out of place.
5.2 class vfs<sec: class vfs>
abstract: virtual file system
description: Authors: Zone, Seek3r
5.3 class path_class<sec: class path_class>
abstract: helper class for path_parts
5.4 vfs<sec: vfs>
abstract: constructor, sets up variables
function vfs ()
5.5 set_relative<sec: set_relative>
abstract: Set path relativity
param: $mask Relative bitmask (see RELATIVE_ defines)
function set_relative ($mask)
5.6 get_relative<sec: get_relative>
abstract: Return relativity bitmask
discussion: Returns relativity bitmask, or the default of "completely
relative" if unset
function get_relative ()
5.7 sanitize<sec: sanitize>
abstract: Removes leading .'s from $string
discussion: You should not pass all filenames through sanitize () unless
you plan on rejecting
.files. Instead, pass the name through securitycheck () first, and
if it fails,
pass it through sanitize
param: $string string to sanitize
result: $string without it's leading .'s
function sanitize ($string)
5.8 securitycheck<sec: securitycheck>
abstract: Security check function
discussion: Checks for basic violations such as ..
If securitycheck () fails, run your string through vfs->sanitize ()
param: $string string to check security of
result: Boolean True/False. True means secure, False means insecure
function securitycheck ($string)
5.9 db_clean<sec: db_clean>
abstract: Clean $string for use in database queries
param: $string String to clean
result: Cleaned version of $string
function db_clean ($string)
5.10 path_parts<sec: path_parts>
abstract: take a real or fake pathname and return an array of its component
parts
param: $string full real or fake path
param: $relatives Relativity array
param: $object True returns an object instead of an array
result: $rarray/$robject Array or object containing the fake and real
component parts of the path
discussion: Returned values are:
mask
outside
fake_full_path
fake_leading_dirs
fake_extra_path
fake_name
real_full_path
real_leading_dirs
real_extra_path
real_name
fake_full_path_clean
fake_leading_dirs_clean
fake_extra_path_clean
fake_name_clean
real_full_path_clean
real_leading_dirs_clean
real_extra_path_clean
real_name_clean
"clean" values are run through vfs->db_clean () and
are safe for use in SQL queries that use key='value'
They should be used ONLY for SQL queries, so are used
mostly internally
mask is either RELATIVE_NONE or RELATIVE_NONE|VFS_REAL,
and is used internally
outside is boolean, True if $relatives contains VFS_REAL
function path_parts ($string, $relatives = array (RELATIVE_CURRENT),
$object = True)
5.11 getabsolutepath<sec: getabsolutepath>
abstract: get the absolute path
param: $target defaults to False, directory/file to get path of, relative
to $relatives[0]
param: $mask Relativity bitmask (see RELATIVE_ defines). RELATIVE_CURRENT
means use $this->relative
param: $fake Returns the "fake" path, ie /home/user/dir/file (not always
possible. use path_parts () instead)
result: $basedir Full fake or real path
function getabsolutepath ($target = False, $relatives = array (RELATIVE_CURRENT),
$fake = True)
5.12 cd<sec: cd>
abstract: Change directory
discussion: To cd to the files root "/", use cd ("/", False, array
(RELATIVE_NONE));
param: $target default "/". directory to cd into. if "/" and $relative
is True, uses "/home/<working_lid>";
param: $relative default True/relative means add target to current
path, else pass $relative as mask to getabsolutepath()
function cd ($target = "/", $relative = True, $relatives = array (RELATIVE_CURRENT))
5.13 pwd<sec: pwd>
abstract: current working dir
param: $full default True returns full fake path, else just the extra
dirs (false strips the leading /)
result: $currentdir currentdir
function pwd ($full = True)
5.14 read<sec: read>
abstract: return file contents
param: $file filename
param: $relatives Relativity array
result: $contents Contents of $file, or False if file cannot be read
function read ($file, $relatives = array (RELATIVE_CURRENT))
5.15 write<sec: write>
abstract: write to a file
param: $file file name
param: $relatives Relativity array
param: $contents contents
result: Boolean True/False
function write ($file, $relatives = array (RELATIVE_CURRENT), $contents)
5.16 touch<sec: touch>
abstract: Create blank file $file or set the modification time and
modified by of $file to current time and user
param: $file File to touch or set modifies
param: $relatives Relativity array
result: Boolean True/False
function touch ($file, $relatives = array (RELATIVE_CURRENT))
5.17 cp<sec: cp>
abstract: copy file
param: $from from file/directory
param: $to to file/directory
param: $relatives Relativity array
result: boolean True/False
function cp ($from, $to, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
5.18 mv<sec: mv>
abstract: move file/directory
param: $from from file/directory
param: $to to file/directory
param: $relatives Relativity array
result: boolean True/False
function mv ($from, $to, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
5.19 move<sec: move>
abstract: shortcut to mv
function move ($from, $to, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
5.20 rm<sec: rm>
abstract: delete file/directory
param: $string file/directory to delete
param: $relatives Relativity array
result: boolean True/False
function rm ($string, $relatives = array (RELATIVE_CURRENT))
5.21 delete<sec: delete>
abstract: shortcut to rm
function delete ($string, $relatives = array (RELATIVE_CURRENT))
5.22 mkdir<sec: mkdir>
abstract: make a new directory
param: $dir Directory name
param: $relatives Relativity array
result: boolean True on success
function mkdir ($dir, $relatives = array (RELATIVE_CURRENT))
5.23 set_attributes<sec: set_attributes>
abstract: Update database entry for $file with the attributes in $attributes
param: $file file/directory to update
param: $relatives Relativity array
param: $attributes keyed array of attributes. key is attribute name,
value is attribute value
result: Boolean True/False
discussion: Valid attributes are:
owner_id
createdby_id
modifiedby_id
created
modified
size
mime_type
deleteable
comment
app
function set_attributes ($file, $relatives = array (RELATIVE_CURRENT),
$attributes = array ())
5.24 correct_attributes<sec: correct_attributes>
abstract: Set the correct attributes for $string (e.g. owner)
param: $string File/directory to correct attributes of
param: $relatives Relativity array
result: Boolean True/False
function correct_attributes ($string, $relatives = array (RELATIVE_CURRENT))
5.25 file_type<sec: file_type>
abstract: return file/dir type (MIME or other)
param: $file File or directory path (/home/user/dir/dir2/dir3, /home/user/dir/dir2/file)
param: $relatives Relativity array
result: MIME type, "Directory", or nothing if MIME type is not known
function file_type ($file, $relatives = array (RELATIVE_CURRENT))
5.26 file_exists<sec: file_exists>
abstract: check if file/directory exists
param: $string file/directory to check existance of
param: $relatives Relativity array
result: Boolean True/False
function file_exists ($string, $relatives = array (RELATIVE_CURRENT))
5.27 checkperms<sec: checkperms>
abstract: Check if you have write access to create files in $dir
discussion: This isn't perfect, because vfs->touch () returns True
even
if only the database entry worked. ACLs need to be
implemented for better permission checking. It's
also pretty slow, so I wouldn't recommend using it
often
param: $dir Directory to check access of
param: $relatives Relativity array
result: Boolean True/False
function checkperms ($dir, $relatives = array (RELATIVE_CURRENT))
5.28 ls<sec: ls>
abstract: get directory listing
discussion: Note: the entries are not guaranteed to be returned in
any logical order
param: $dir Directory
param: $relatives Relativity array
param: $checksubdirs Boolean, recursively list all sub directories
as well?
param: $mime_type Only return entries matching MIME-type $mime_type.
Can be "Directory" or "\" for those without MIME types
param: $nofiles Boolean. True means you want to return just the information
about the directory $dir. If $dir is a file, $nofiles is implied.
This is the equivalent of 'ls -ld $dir'
result: array of arrays. Subarrays contain full info for each file/dir.
function ls ($dir = False, $relatives = array (RELATIVE_CURRENT), $checksubdirs
= True, $mime_type = False, $nofiles = False)
5.29 dir<sec: dir>
abstract: shortcut to ls
function dir ($dir = False, $relatives = array (RELATIVE_CURRENT),
$checksubdirs = True, $mime_type = False, $nofiles = False)
6 Notes<sec:notes>
6.1 Database<sec:database>
Data about the files and directories within the virtual root is kept
in the SQL database. Currently, this information includes:
* File ID (used internally, primary key for table)
* Owner ID (phpGW account_id)
* Created by ID (phpGW account_id)
* Modified by ID (phpGW account_id)
* Created (date)
* Modified (date)
* Size (bytes)
* MIME type
* Deleteable (Y/N/Other?)
* Comment
* App (appname of application that created the file)
* Directory (directory the file or directory is in)
* Name (name of file or directory)
The internal names of these (the database column names) are stored
in the $phpgw->vfs->attributes array, which is useful for loops, and
is guaranteed to be up-to-date.
Note that no information is kept about files outside the virtual root.
If a file is moved outside, all records of it are delete from the
database. If a file is moved into the virtual root, some information,
specifically MIME-type, is not stored in the database. The vital information
has defaults: owner is based on where the file is being stored; size
is correctly read; deleteable is set to Y.
6.2 ACL support<sec:acl_support>
Because of the many different ways the VFS can be used, complete ACL
support is not built in. There is a bit of access control built in,
just because of the way database queries are made. However, that is
a discussion beyond the scope of this document. Full ACL support may
be added at a later time. For now, it is fairly easy to add basic
access control to your application by matching path expressions. The
VFS always follows the same naming convention of $fakebase/userorgroup.
So if you need to check if a user has access to $fakebase/whatever/dir/file,
you need only know if they their username is 'whatever' or if they
belong to the group 'whatever', and that the group has access to your
application. Here is an example from PHPWebHosting:
###
# First we get their memberships
###
$memberships = $phpgw->accounts->memberships ($account_id);
###
# We determine if they're in their home directory or a group's directory
# If they request a group's directory, we ensure they have access to
the group,
# and the group has access to the app
###
if ((preg_match ("+^$fakebase\/(.*)(\/|$)+U", $path, $matches)) && $matches[1]
!= $account_lid)
{
$phpgw->vfs->working_id = $phpgw->accounts->name2id ($matches[1]);
reset ($memberships);
while (list ($num, $group_array) = each ($memberships))
{
if ($matches[1] == $group_array["account_name"])
{
$group_ok = 1;
break;
}
}
if (!$group_ok)
{
echo $phpgw->common->error_list (array ("You do not have
access to group/directory $matches[1]"));
exit;
}
}
You should also check if the group has access to your appilcation.
6.3 Function aliases<sec:function_aliases>
You might have noticed there are some functions that just pass the
arguments on to other functions. These are provided in part because
of legacy and in part for convenience. You can use either. Here is
the list (alias -> actual):
* copy -> cp
* move -> rm
* delete -> rm
* dir -> ls
6.4 Fakebase directory (changing /home)<sec:fakebase>
The old VFS was hard-coded to use "/home" as the fake base directory,
even though the user never saw it. With the new system, crafty administrators
may wish to change "/home" to something else, say "/users" or "/public_html".
The fake base directory name is stored in $phpgw->vfs->fakebase, and
changing it will transparently change it throughout the VFS and all
applications. However, this must be done before any data is in the
VFS database. If you wish to change it afterwords, you'll have to
manually update the database, replacing the old value with the new
value. Application programmers need to recognize that /home is not
absolute, and use $phpgw->vfs->fakebase instead. I suggest setting
$fakebase = $phpgw->vfs->fakebase; right off the bat to keep things
neater.

View File

@ -0,0 +1,636 @@
\lyxformat 2.16
\textclass linuxdoc
\language default
\inputencoding latin1
\fontscheme default
\graphics default
\paperfontsize default
\spacing single
\papersize Default
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\paperorientation portrait
\secnumdepth 2
\tocdepth 2
\paragraph_separation indent
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default
\layout Title
\added_space_top vfill \added_space_bottom vfill
VFS class functions
\layout Author
Jason Wies
\layout Date
June 2001
\layout Abstract
\layout Section
VFS class functions
\layout Subsection
class vfs
\begin_inset LatexCommand \label{sec: class vfs}
\end_inset
\layout Standard
abstract: virtual file system
\layout Standard
description: Authors: Zone, Seek3r
\layout Subsection
class path_class
\begin_inset LatexCommand \label{sec: class path_class}
\end_inset
\layout Standard
abstract: helper class for path_parts
\layout Subsection
vfs
\begin_inset LatexCommand \label{sec: vfs}
\end_inset
\layout Standard
abstract: constructor, sets up variables
\layout Verbatim
function vfs ()
\layout Subsection
set_relative
\begin_inset LatexCommand \label{sec: set_relative}
\end_inset
\layout Standard
abstract: Set path relativity
\layout Standard
param: $mask Relative bitmask (see RELATIVE_ defines)
\layout Verbatim
function set_relative ($mask)
\layout Subsection
get_relative
\begin_inset LatexCommand \label{sec: get_relative}
\end_inset
\layout Standard
abstract: Return relativity bitmask
\layout Standard
discussion: Returns relativity bitmask, or the default of "completely relative" if unset
\layout Verbatim
function get_relative ()
\layout Subsection
sanitize
\begin_inset LatexCommand \label{sec: sanitize}
\end_inset
\layout Standard
abstract: Removes leading .'s from $string
\layout Standard
discussion: You should not pass all filenames through sanitize () unless you plan on rejecting\layout Standard
.files. Instead, pass the name through securitycheck () first, and if it fails,\layout Standard
pass it through sanitize
\layout Standard
param: $string string to sanitize
\layout Standard
result: $string without it's leading .'s
\layout Verbatim
function sanitize ($string)
\layout Subsection
securitycheck
\begin_inset LatexCommand \label{sec: securitycheck}
\end_inset
\layout Standard
abstract: Security check function
\layout Standard
discussion: Checks for basic violations such as ..\layout Standard
If securitycheck () fails, run your string through vfs->sanitize ()
\layout Standard
param: $string string to check security of
\layout Standard
result: Boolean True/False. True means secure, False means insecure
\layout Verbatim
function securitycheck ($string)
\layout Subsection
db_clean
\begin_inset LatexCommand \label{sec: db_clean}
\end_inset
\layout Standard
abstract: Clean $string for use in database queries
\layout Standard
param: $string String to clean
\layout Standard
result: Cleaned version of $string
\layout Verbatim
function db_clean ($string)
\layout Subsection
path_parts
\begin_inset LatexCommand \label{sec: path_parts}
\end_inset
\layout Standard
abstract: take a real or fake pathname and return an array of its component parts
\layout Standard
param: $string full real or fake path
\layout Standard
param: $relatives Relativity array
\layout Standard
param: $object True returns an object instead of an array
\layout Standard
result: $rarray/$robject Array or object containing the fake and real component parts of the path
\layout Standard
discussion: Returned values are:\layout Standard
mask\layout Standard
outside\layout Standard
fake_full_path\layout Standard
fake_leading_dirs\layout Standard
fake_extra_path\layout Standard
fake_name\layout Standard
real_full_path\layout Standard
real_leading_dirs\layout Standard
real_extra_path\layout Standard
real_name\layout Standard
fake_full_path_clean\layout Standard
fake_leading_dirs_clean\layout Standard
fake_extra_path_clean\layout Standard
fake_name_clean\layout Standard
real_full_path_clean\layout Standard
real_leading_dirs_clean\layout Standard
real_extra_path_clean\layout Standard
real_name_clean\layout Standard
"clean" values are run through vfs->db_clean () and\layout Standard
are safe for use in SQL queries that use key='value'\layout Standard
They should be used ONLY for SQL queries, so are used\layout Standard
mostly internally\layout Standard
mask is either RELATIVE_NONE or RELATIVE_NONE|VFS_REAL,\layout Standard
and is used internally\layout Standard
outside is boolean, True if $relatives contains VFS_REAL
\layout Verbatim
function path_parts ($string, $relatives = array (RELATIVE_CURRENT), $object = True)
\layout Subsection
getabsolutepath
\begin_inset LatexCommand \label{sec: getabsolutepath}
\end_inset
\layout Standard
abstract: get the absolute path
\layout Standard
param: $target defaults to False, directory/file to get path of, relative to $relatives[0]
\layout Standard
param: $mask Relativity bitmask (see RELATIVE_ defines). RELATIVE_CURRENT means use $this->relative
\layout Standard
param: $fake Returns the "fake" path, ie /home/user/dir/file (not always possible. use path_parts () instead)
\layout Standard
result: $basedir Full fake or real path
\layout Verbatim
function getabsolutepath ($target = False, $relatives = array (RELATIVE_CURRENT), $fake = True)
\layout Subsection
cd
\begin_inset LatexCommand \label{sec: cd}
\end_inset
\layout Standard
abstract: Change directory
\layout Standard
discussion: To cd to the files root "/", use cd ("/", False, array (RELATIVE_NONE));
\layout Standard
param: $target default "/". directory to cd into. if "/" and $relative is True, uses "/home/<working_lid>";
\layout Standard
param: $relative default True/relative means add target to current path, else pass $relative as mask to getabsolutepath()
\layout Verbatim
function cd ($target = "/", $relative = True, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
pwd
\begin_inset LatexCommand \label{sec: pwd}
\end_inset
\layout Standard
abstract: current working dir
\layout Standard
param: $full default True returns full fake path, else just the extra dirs (false strips the leading /)
\layout Standard
result: $currentdir currentdir
\layout Verbatim
function pwd ($full = True)
\layout Subsection
read
\begin_inset LatexCommand \label{sec: read}
\end_inset
\layout Standard
abstract: return file contents
\layout Standard
param: $file filename
\layout Standard
param: $relatives Relativity array
\layout Standard
result: $contents Contents of $file, or False if file cannot be read
\layout Verbatim
function read ($file, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
write
\begin_inset LatexCommand \label{sec: write}
\end_inset
\layout Standard
abstract: write to a file
\layout Standard
param: $file file name
\layout Standard
param: $relatives Relativity array
\layout Standard
param: $contents contents
\layout Standard
result: Boolean True/False
\layout Verbatim
function write ($file, $relatives = array (RELATIVE_CURRENT), $contents)
\layout Subsection
touch
\begin_inset LatexCommand \label{sec: touch}
\end_inset
\layout Standard
abstract: Create blank file $file or set the modification time and modified by of $file to current time and user
\layout Standard
param: $file File to touch or set modifies
\layout Standard
param: $relatives Relativity array
\layout Standard
result: Boolean True/False
\layout Verbatim
function touch ($file, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
cp
\begin_inset LatexCommand \label{sec: cp}
\end_inset
\layout Standard
abstract: copy file
\layout Standard
param: $from from file/directory
\layout Standard
param: $to to file/directory
\layout Standard
param: $relatives Relativity array
\layout Standard
result: boolean True/False
\layout Verbatim
function cp ($from, $to, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
\layout Subsection
mv
\begin_inset LatexCommand \label{sec: mv}
\end_inset
\layout Standard
abstract: move file/directory
\layout Standard
param: $from from file/directory
\layout Standard
param: $to to file/directory
\layout Standard
param: $relatives Relativity array
\layout Standard
result: boolean True/False
\layout Verbatim
function mv ($from, $to, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
\layout Subsection
move
\begin_inset LatexCommand \label{sec: move}
\end_inset
\layout Standard
abstract: shortcut to mv
\layout Verbatim
function move ($from, $to, $relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
\layout Subsection
rm
\begin_inset LatexCommand \label{sec: rm}
\end_inset
\layout Standard
abstract: delete file/directory
\layout Standard
param: $string file/directory to delete
\layout Standard
param: $relatives Relativity array
\layout Standard
result: boolean True/False
\layout Verbatim
function rm ($string, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
delete
\begin_inset LatexCommand \label{sec: delete}
\end_inset
\layout Standard
abstract: shortcut to rm
\layout Verbatim
function delete ($string, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
mkdir
\begin_inset LatexCommand \label{sec: mkdir}
\end_inset
\layout Standard
abstract: make a new directory
\layout Standard
param: $dir Directory name
\layout Standard
param: $relatives Relativity array
\layout Standard
result: boolean True on success
\layout Verbatim
function mkdir ($dir, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
set_attributes
\begin_inset LatexCommand \label{sec: set_attributes}
\end_inset
\layout Standard
abstract: Update database entry for $file with the attributes in $attributes
\layout Standard
param: $file file/directory to update
\layout Standard
param: $relatives Relativity array
\layout Standard
param: $attributes keyed array of attributes. key is attribute name, value is attribute value
\layout Standard
result: Boolean True/False
\layout Standard
discussion: Valid attributes are:\layout Standard
owner_id\layout Standard
createdby_id\layout Standard
modifiedby_id\layout Standard
created\layout Standard
modified\layout Standard
size\layout Standard
mime_type\layout Standard
deleteable\layout Standard
comment\layout Standard
app
\layout Verbatim
function set_attributes ($file, $relatives = array (RELATIVE_CURRENT), $attributes = array ())
\layout Subsection
correct_attributes
\begin_inset LatexCommand \label{sec: correct_attributes}
\end_inset
\layout Standard
abstract: Set the correct attributes for $string (e.g. owner)
\layout Standard
param: $string File/directory to correct attributes of
\layout Standard
param: $relatives Relativity array
\layout Standard
result: Boolean True/False
\layout Verbatim
function correct_attributes ($string, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
file_type
\begin_inset LatexCommand \label{sec: file_type}
\end_inset
\layout Standard
abstract: return file/dir type (MIME or other)
\layout Standard
param: $file File or directory path (/home/user/dir/dir2/dir3, /home/user/dir/dir2/file)
\layout Standard
param: $relatives Relativity array
\layout Standard
result: MIME type, "Directory", or nothing if MIME type is not known
\layout Verbatim
function file_type ($file, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
file_exists
\begin_inset LatexCommand \label{sec: file_exists}
\end_inset
\layout Standard
abstract: check if file/directory exists
\layout Standard
param: $string file/directory to check existance of
\layout Standard
param: $relatives Relativity array
\layout Standard
result: Boolean True/False
\layout Verbatim
function file_exists ($string, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
checkperms
\begin_inset LatexCommand \label{sec: checkperms}
\end_inset
\layout Standard
abstract: Check if you have write access to create files in $dir
\layout Standard
discussion: This isn't perfect, because vfs->touch () returns True even\layout Standard
if only the database entry worked. ACLs need to be\layout Standard
implemented for better permission checking. It's\layout Standard
also pretty slow, so I wouldn't recommend using it\layout Standard
often
\layout Standard
param: $dir Directory to check access of
\layout Standard
param: $relatives Relativity array
\layout Standard
result: Boolean True/False
\layout Verbatim
function checkperms ($dir, $relatives = array (RELATIVE_CURRENT))
\layout Subsection
ls
\begin_inset LatexCommand \label{sec: ls}
\end_inset
\layout Standard
abstract: get directory listing
\layout Standard
discussion: Note: the entries are not guaranteed to be returned in any logical order
\layout Standard
param: $dir Directory
\layout Standard
param: $relatives Relativity array
\layout Standard
param: $checksubdirs Boolean, recursively list all sub directories as well?
\layout Standard
param: $mime_type Only return entries matching MIME-type $mime_type. Can be "Directory" or "\ " for those without MIME types
\layout Standard
param: $nofiles Boolean. True means you want to return just the information about the directory $dir. If $dir is a file, $nofiles is implied. This is the equivalent of 'ls -ld $dir'
\layout Standard
result: array of arrays. Subarrays contain full info for each file/dir.
\layout Verbatim
function ls ($dir = False, $relatives = array (RELATIVE_CURRENT), $checksubdirs = True, $mime_type = False, $nofiles = False)
\layout Subsection
dir
\begin_inset LatexCommand \label{sec: dir}
\end_inset
\layout Standard
abstract: shortcut to ls
\layout Verbatim
function dir ($dir = False, $relatives = array (RELATIVE_CURRENT), $checksubdirs = True, $mime_type = False, $nofiles = False)
\the_end

View File

@ -0,0 +1,636 @@
<!doctype linuxdoc system>
<!-- LyX 1.1 created this file. For more info see http://www.lyx.org/ -->
<article>
<title>
VFS class functions
</title>
<author>
Jason Wies
</author>
<date>
June 2001
</date>
<abstract>
</abstract>
<sect>
VFS class functions
<sect1>
class vfs<label id="sec: class vfs" >
<p>
abstract: virtual file system
</p>
<p>
description: Authors: Zone, Seek3r
</p>
<sect1>
class path_class<label id="sec: class path_class" >
<p>
abstract: helper class for path_parts
</p>
<sect1>
vfs<label id="sec: vfs" >
<p>
abstract: constructor, sets up variables
</p>
<p>
<verb>
function vfs ()
</verb>
</p><sect1>
set_relative<label id="sec: set_relative" >
<p>
abstract: Set path relativity
</p>
<p>
param: &dollar;mask Relative bitmask (see RELATIVE_ defines)
</p>
<p>
<verb>
function set_relative (&dollar;mask)
</verb>
</p><sect1>
get_relative<label id="sec: get_relative" >
<p>
abstract: Return relativity bitmask
</p>
<p>
discussion: Returns relativity bitmask, or the default of &quot;completely
relative&quot; if unset
</p>
<p>
<verb>
function get_relative ()
</verb>
</p><sect1>
sanitize<label id="sec: sanitize" >
<p>
abstract: Removes leading .'s from &dollar;string
</p>
<p>
discussion: You should not pass all filenames through sanitize () unless
you plan on rejecting
</p>
<p>
.files. Instead, pass the name through securitycheck () first, and if
it fails,
</p>
<p>
pass it through sanitize
</p>
<p>
param: &dollar;string string to sanitize
</p>
<p>
result: &dollar;string without it's leading .'s
</p>
<p>
<verb>
function sanitize (&dollar;string)
</verb>
</p><sect1>
securitycheck<label id="sec: securitycheck" >
<p>
abstract: Security check function
</p>
<p>
discussion: Checks for basic violations such as ..
</p>
<p>
If securitycheck () fails, run your string through vfs-&gt;sanitize ()
</p>
<p>
param: &dollar;string string to check security of
</p>
<p>
result: Boolean True/False. True means secure, False means insecure
</p>
<p>
<verb>
function securitycheck (&dollar;string)
</verb>
</p><sect1>
db_clean<label id="sec: db_clean" >
<p>
abstract: Clean &dollar;string for use in database queries
</p>
<p>
param: &dollar;string String to clean
</p>
<p>
result: Cleaned version of &dollar;string
</p>
<p>
<verb>
function db_clean (&dollar;string)
</verb>
</p><sect1>
path_parts<label id="sec: path_parts" >
<p>
abstract: take a real or fake pathname and return an array of its component
parts
</p>
<p>
param: &dollar;string full real or fake path
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
param: &dollar;object True returns an object instead of an array
</p>
<p>
result: &dollar;rarray/&dollar;robject Array or object containing the fake
and real component parts of the path
</p>
<p>
discussion: Returned values are:
</p>
<p>
mask
</p>
<p>
outside
</p>
<p>
fake_full_path
</p>
<p>
fake_leading_dirs
</p>
<p>
fake_extra_path
</p>
<p>
fake_name
</p>
<p>
real_full_path
</p>
<p>
real_leading_dirs
</p>
<p>
real_extra_path
</p>
<p>
real_name
</p>
<p>
fake_full_path_clean
</p>
<p>
fake_leading_dirs_clean
</p>
<p>
fake_extra_path_clean
</p>
<p>
fake_name_clean
</p>
<p>
real_full_path_clean
</p>
<p>
real_leading_dirs_clean
</p>
<p>
real_extra_path_clean
</p>
<p>
real_name_clean
</p>
<p>
&quot;clean&quot; values are run through vfs-&gt;db_clean () and
</p>
<p>
are safe for use in SQL queries that use key='value'
</p>
<p>
They should be used ONLY for SQL queries, so are used
</p>
<p>
mostly internally
</p>
<p>
mask is either RELATIVE_NONE or RELATIVE_NONE|VFS_REAL,
</p>
<p>
and is used internally
</p>
<p>
outside is boolean, True if &dollar;relatives contains VFS_REAL
</p>
<p>
<verb>
function path_parts (&dollar;string, &dollar;relatives = array (RELATIVE_CURRENT), &dollar;object = True)
</verb>
</p><sect1>
getabsolutepath<label id="sec: getabsolutepath" >
<p>
abstract: get the absolute path
</p>
<p>
param: &dollar;target defaults to False, directory/file to get path of,
relative to &dollar;relatives&lsqb;0&rsqb;
</p>
<p>
param: &dollar;mask Relativity bitmask (see RELATIVE_ defines). RELATIVE_CURRENT
means use &dollar;this-&gt;relative
</p>
<p>
param: &dollar;fake Returns the &quot;fake&quot; path, ie /home/user/dir/file
(not always possible. use path_parts () instead)
</p>
<p>
result: &dollar;basedir Full fake or real path
</p>
<p>
<verb>
function getabsolutepath (&dollar;target = False, &dollar;relatives = array (RELATIVE_CURRENT), &dollar;fake = True)
</verb>
</p><sect1>
cd<label id="sec: cd" >
<p>
abstract: Change directory
</p>
<p>
discussion: To cd to the files root &quot;/&quot;, use cd (&quot;/&quot;,
False, array (RELATIVE_NONE));
</p>
<p>
param: &dollar;target default &quot;/&quot;. directory to cd into. if
&quot;/&quot; and &dollar;relative is True, uses &quot;/home/&lt;working_lid&gt;&quot;;
</p>
<p>
param: &dollar;relative default True/relative means add target to current
path, else pass &dollar;relative as mask to getabsolutepath()
</p>
<p>
<verb>
function cd (&dollar;target = &quot;/&quot;, &dollar;relative = True, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
pwd<label id="sec: pwd" >
<p>
abstract: current working dir
</p>
<p>
param: &dollar;full default True returns full fake path, else just the
extra dirs (false strips the leading /)
</p>
<p>
result: &dollar;currentdir currentdir
</p>
<p>
<verb>
function pwd (&dollar;full = True)
</verb>
</p><sect1>
read<label id="sec: read" >
<p>
abstract: return file contents
</p>
<p>
param: &dollar;file filename
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: &dollar;contents Contents of &dollar;file, or False if file cannot
be read
</p>
<p>
<verb>
function read (&dollar;file, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
write<label id="sec: write" >
<p>
abstract: write to a file
</p>
<p>
param: &dollar;file file name
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
param: &dollar;contents contents
</p>
<p>
result: Boolean True/False
</p>
<p>
<verb>
function write (&dollar;file, &dollar;relatives = array (RELATIVE_CURRENT), &dollar;contents)
</verb>
</p><sect1>
touch<label id="sec: touch" >
<p>
abstract: Create blank file &dollar;file or set the modification time and
modified by of &dollar;file to current time and user
</p>
<p>
param: &dollar;file File to touch or set modifies
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: Boolean True/False
</p>
<p>
<verb>
function touch (&dollar;file, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
cp<label id="sec: cp" >
<p>
abstract: copy file
</p>
<p>
param: &dollar;from from file/directory
</p>
<p>
param: &dollar;to to file/directory
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: boolean True/False
</p>
<p>
<verb>
function cp (&dollar;from, &dollar;to, &dollar;relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
</verb>
</p><sect1>
mv<label id="sec: mv" >
<p>
abstract: move file/directory
</p>
<p>
param: &dollar;from from file/directory
</p>
<p>
param: &dollar;to to file/directory
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: boolean True/False
</p>
<p>
<verb>
function mv (&dollar;from, &dollar;to, &dollar;relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
</verb>
</p><sect1>
move<label id="sec: move" >
<p>
abstract: shortcut to mv
</p>
<p>
<verb>
function move (&dollar;from, &dollar;to, &dollar;relatives = array (RELATIVE_CURRENT, RELATIVE_CURRENT))
</verb>
</p><sect1>
rm<label id="sec: rm" >
<p>
abstract: delete file/directory
</p>
<p>
param: &dollar;string file/directory to delete
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: boolean True/False
</p>
<p>
<verb>
function rm (&dollar;string, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
delete<label id="sec: delete" >
<p>
abstract: shortcut to rm
</p>
<p>
<verb>
function delete (&dollar;string, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
mkdir<label id="sec: mkdir" >
<p>
abstract: make a new directory
</p>
<p>
param: &dollar;dir Directory name
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: boolean True on success
</p>
<p>
<verb>
function mkdir (&dollar;dir, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
set_attributes<label id="sec: set_attributes" >
<p>
abstract: Update database entry for &dollar;file with the attributes in
&dollar;attributes
</p>
<p>
param: &dollar;file file/directory to update
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
param: &dollar;attributes keyed array of attributes. key is attribute
name, value is attribute value
</p>
<p>
result: Boolean True/False
</p>
<p>
discussion: Valid attributes are:
</p>
<p>
owner_id
</p>
<p>
createdby_id
</p>
<p>
modifiedby_id
</p>
<p>
created
</p>
<p>
modified
</p>
<p>
size
</p>
<p>
mime_type
</p>
<p>
deleteable
</p>
<p>
comment
</p>
<p>
app
</p>
<p>
<verb>
function set_attributes (&dollar;file, &dollar;relatives = array (RELATIVE_CURRENT), &dollar;attributes = array ())
</verb>
</p><sect1>
correct_attributes<label id="sec: correct_attributes" >
<p>
abstract: Set the correct attributes for &dollar;string (e.g. owner)
</p>
<p>
param: &dollar;string File/directory to correct attributes of
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: Boolean True/False
</p>
<p>
<verb>
function correct_attributes (&dollar;string, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
file_type<label id="sec: file_type" >
<p>
abstract: return file/dir type (MIME or other)
</p>
<p>
param: &dollar;file File or directory path (/home/user/dir/dir2/dir3, /home/user/dir/dir2/file)
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: MIME type, &quot;Directory&quot;, or nothing if MIME type is not
known
</p>
<p>
<verb>
function file_type (&dollar;file, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
file_exists<label id="sec: file_exists" >
<p>
abstract: check if file/directory exists
</p>
<p>
param: &dollar;string file/directory to check existance of
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: Boolean True/False
</p>
<p>
<verb>
function file_exists (&dollar;string, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
checkperms<label id="sec: checkperms" >
<p>
abstract: Check if you have write access to create files in &dollar;dir
</p>
<p>
discussion: This isn't perfect, because vfs-&gt;touch () returns True even
</p>
<p>
if only the database entry worked. ACLs need to be
</p>
<p>
implemented for better permission checking. It's
</p>
<p>
also pretty slow, so I wouldn't recommend using it
</p>
<p>
often
</p>
<p>
param: &dollar;dir Directory to check access of
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
result: Boolean True/False
</p>
<p>
<verb>
function checkperms (&dollar;dir, &dollar;relatives = array (RELATIVE_CURRENT))
</verb>
</p><sect1>
ls<label id="sec: ls" >
<p>
abstract: get directory listing
</p>
<p>
discussion: Note: the entries are not guaranteed to be returned in any
logical order
</p>
<p>
param: &dollar;dir Directory
</p>
<p>
param: &dollar;relatives Relativity array
</p>
<p>
param: &dollar;checksubdirs Boolean, recursively list all sub directories
as well?
</p>
<p>
param: &dollar;mime_type Only return entries matching MIME-type &dollar;mime_type.
Can be &quot;Directory&quot; or &quot;&bsol;&quot; for those without MIME
types
</p>
<p>
param: &dollar;nofiles Boolean. True means you want to return just the
information about the directory &dollar;dir. If &dollar;dir is a file, &dollar;nofiles
is implied. This is the equivalent of 'ls -ld &dollar;dir'
</p>
<p>
result: array of arrays. Subarrays contain full info for each file/dir.
</p>
<p>
<verb>
function ls (&dollar;dir = False, &dollar;relatives = array (RELATIVE_CURRENT), &dollar;checksubdirs = True, &dollar;mime_type = False, &dollar;nofiles = False)
</verb>
</p><sect1>
dir<label id="sec: dir" >
<p>
abstract: shortcut to ls
</p>
<p>
<verb>
function dir (&dollar;dir = False, &dollar;relatives = array (RELATIVE_CURRENT), &dollar;checksubdirs = True, &dollar;mime_type = False, &dollar;nofiles = False)
</verb>
</article>