diff --git a/filemanager/index.php b/filemanager/index.php
index 4d55511d8a..f6144afecb 100755
--- a/filemanager/index.php
+++ b/filemanager/index.php
@@ -83,9 +83,6 @@ $now = date ("Y-m-d");
//This will hopefully be replaced by a session management working_id
//if (!$phpgw->vfs->working_id = preg_replace ("/\$fakebase\/(.*)\/(.*)$/U", "\\1", $path))
-$userinfo["working_id"] = $phpgw->vfs->working_id;
-$userinfo["working_lid"] = $phpgw->accounts->id2name ($userinfo["working_id"]);
-
if ($phpwh_debug)
{
echo "PHPWebHosting debug:
@@ -101,8 +98,57 @@ if ($phpwh_debug)
pwd: " . $phpgw->vfs->pwd () . "
";
}
+###
+# Get their memberships to be used throughout the script
+###
+
+$memberships = $phpgw->accounts->memberships ($userinfo["username"]);
+
+###
+# 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] != $userinfo["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]"));
+ html_page_close ();
+ }
+
+/* WIP - how are we actually supposed to use the API to determine if a group has access to an app?
+ $group_acl = CreateObject('phpgwapi.acl', $phpgw->accounts->name2id ($matches[1]));
+ if ($group_acl->get_specific_rights () == False)
+ {
+ echo $phpgw->common->error_list (array ("The group $matches[1] does not have access to $appname"));
+ html_page_close ();
+ }
+*/
+}
+else
+{
+ $phpgw->vfs->working_id = $userinfo["username"];
+}
+
+$userinfo["working_id"] = $phpgw->vfs->working_id;
+$userinfo["working_lid"] = $phpgw->accounts->id2name ($userinfo["working_id"]);
+
###
# If their home directory doesn't exist, we create it
+# Same for group directories
###
if (($path == $homedir) && !$phpgw->vfs->file_exists ($homedir, array (RELATIVE_NONE)))
@@ -153,9 +199,8 @@ if ($path == $fakebase)
$files_array[] = $phpgw->vfs->ls ($homedir, array (RELATIVE_NONE), False, False, True);
$numoffiles++;
- $groups = $phpgw->accounts->memberships ($userinfo["username"]);
-
- while (list ($num, $group_array) = each ($groups))
+ reset ($memberships);
+ while (list ($num, $group_array) = each ($memberships))
{
if (!$phpgw->vfs->file_exists ("$fakebase/$group_array[account_name]", array (RELATIVE_NONE)))
{
@@ -334,7 +379,7 @@ if (!$op && !$delete && !$createdir && !$renamefiles && !$move && !$copy && !$ed
html_table_col_begin ("right");
- if (!$rename && !$edit_comments)
+ if (!$rename && !$edit_comments && $path != $fakebase && $path != "/")
{
html_form_input ("checkbox", "fileman[$i]", "$files[name]");
}
@@ -576,25 +621,53 @@ if (!$op && !$delete && !$createdir && !$renamefiles && !$move && !$copy && !$ed
html_form_input ("submit", "move", "Move to:");
html_form_select_begin ("todir");
- $query3 = db_query ("SELECT name, directory FROM phpgw_vfs WHERE owner_id = '$userinfo[username]' AND mime_type = 'Directory' ORDER BY name");
- while ($dirs = db_fetch_array ($query3))
+ ###
+ # First we get the directories in their home directory
+ ###
+
+ $dirs[] = array ("directory" => $fakebase, "name" => $userinfo["account_lid"]);
+
+ $ls_array = $phpgw->vfs->ls ($homedir, array (RELATIVE_NONE), True, "Directory");
+ while (list ($num, $dir) = each ($ls_array))
+ {
+ $dirs[] = $dir;
+ }
+
+ ###
+ # Then we get the directories in their membership's home directories
+ ###
+
+ reset ($memberships);
+ while (list ($num, $group_array) = each ($memberships))
+ {
+ $dirs[] = array ("directory" => $fakebase, "name" => $group_array["account_name"]);
+
+ $ls_array = $phpgw->vfs->ls ("$fakebase/$group_array[account_name]", array (RELATIVE_NONE), True, "Directory");
+ while (list ($num, $dir) = each ($ls_array))
+ {
+ $dirs[] = $dir;
+ }
+ }
+
+ reset ($dirs);
+ while (list ($num, $dir) = each ($dirs))
{
###
# So we don't display //
###
- if ($dirs["directory"] != '/')
+ if ($dir["directory"] != '/')
{
- $dirs["directory"] .= '/';
+ $dir["directory"] .= '/';
}
###
# No point in displaying the current directory
###
- if (($dirs["directory"] . $dirs["name"]) != $path)
+ if (($dir["directory"] . $dir["name"]) != $path)
{
- html_form_option ($dirs["directory"] . $dirs["name"]);
+ html_form_option ($dir["directory"] . $dir["name"]);
}
}