mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-15 20:44:28 +01:00
501df49cbb
- if you already run the 1.5.003 update (AND modified anything in the VFS), you have to re-run it, to not loose your modifications or risk an inconsistent VFS (DB does not match filesystem) - to re-run the 1.5.003 update (only if your version is already 1.5.003 or bigger!) run the following sql: UPDATE egw_applications SET app_version=1.5.002 WHERE app_name=phpgwapi - the new vfs supports now an extended ACL, if that is supported by the backend (sqlfs only currently) - eacl allows to set separate recursive acl rights for different users or groups on a directory (and subdirs) - former group grants of group dirs are converted to eacl, thought we only support read or read+write access (no extra add or delete) - attachments via the links class now also use a stream wrapper interface (links_stream_wrapper) and WebDAV as download handler (which requires no longer filemanager run rights)
254 lines
9.4 KiB
PHP
254 lines
9.4 KiB
PHP
<?php
|
|
/**************************************************************************\
|
|
* eGroupWare - Setup *
|
|
* http://www.egroupware.org *
|
|
* -------------------------------------------- *
|
|
* This program is free software; you can redistribute it and/or modify it *
|
|
* under the terms of the GNU General Public License as published by the *
|
|
* Free Software Foundation; either version 2 of the License, or (at your *
|
|
* option) any later version. *
|
|
\**************************************************************************/
|
|
|
|
// $Id$
|
|
|
|
/* Include older eGroupWare update support */
|
|
include('tables_update_0_9_9.inc.php');
|
|
include('tables_update_0_9_10.inc.php');
|
|
include('tables_update_0_9_12.inc.php');
|
|
include('tables_update_0_9_14.inc.php');
|
|
include('tables_update_1_0.inc.php');
|
|
include('tables_update_1_2.inc.php');
|
|
|
|
// updates from the stable 1.4 branch
|
|
$test[] = '1.4.001';
|
|
function phpgwapi_upgrade1_4_001()
|
|
{
|
|
return $GLOBALS['setup_info']['phpgwapi']['currentver'] = '1.5.001';
|
|
}
|
|
|
|
$test[] = '1.4.002';
|
|
function phpgwapi_upgrade1_4_002()
|
|
{
|
|
return $GLOBALS['setup_info']['phpgwapi']['currentver'] = '1.5.001';
|
|
}
|
|
|
|
$test[] = '1.4.003';
|
|
function phpgwapi_upgrade1_4_003()
|
|
{
|
|
return $GLOBALS['setup_info']['phpgwapi']['currentver'] = '1.5.001';
|
|
}
|
|
|
|
$test[] = '1.5.001';
|
|
function phpgwapi_upgrade1_5_001()
|
|
{
|
|
$GLOBALS['egw_setup']->oProc->AlterColumn('egw_addressbook','org_name',array(
|
|
'type' => 'varchar',
|
|
'precision' => '128',
|
|
'nullable' => true
|
|
));
|
|
$GLOBALS['egw_setup']->oProc->AlterColumn('egw_addressbook','contact_email',array(
|
|
'type' => 'varchar',
|
|
'precision' => '128',
|
|
'nullable' => true
|
|
));
|
|
$GLOBALS['egw_setup']->oProc->AlterColumn('egw_addressbook','contact_email_home',array(
|
|
'type' => 'varchar',
|
|
'precision' => '128',
|
|
'nullable' => true
|
|
));
|
|
|
|
return $GLOBALS['setup_info']['phpgwapi']['currentver'] = '1.5.002';
|
|
}
|
|
|
|
$test[] = '1.5.002';
|
|
function phpgwapi_upgrade1_5_002()
|
|
{
|
|
$GLOBALS['egw_setup']->oProc->CreateTable('egw_sqlfs',array(
|
|
'fd' => array(
|
|
'fs_id' => array('type' => 'auto','nullable' => False),
|
|
'fs_dir' => array('type' => 'int','precision' => '4','nullable' => False),
|
|
'fs_name' => array('type' => 'varchar','precision' => '200','nullable' => False),
|
|
'fs_mode' => array('type' => 'int','precision' => '2','nullable' => False),
|
|
'fs_uid' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0'),
|
|
'fs_gid' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0'),
|
|
'fs_created' => array('type' => 'timestamp','precision' => '8','nullable' => False,'default' => 'current_timestamp'),
|
|
'fs_modified' => array('type' => 'timestamp','precision' => '8','nullable' => False),
|
|
'fs_mime' => array('type' => 'varchar','precision' => '64','nullable' => False),
|
|
'fs_size' => array('type' => 'int','precision' => '8','nullable' => False),
|
|
'fs_creator' => array('type' => 'int','precision' => '4','nullable' => False),
|
|
'fs_modifier' => array('type' => 'int','precision' => '4'),
|
|
'fs_active' => array('type' => 'bool','nullable' => False,'default' => 't'),
|
|
'fs_comment' => array('type' => 'varchar','precision' => '255'),
|
|
'fs_content' => array('type' => 'blob')
|
|
),
|
|
'pk' => array('fs_id'),
|
|
'fk' => array(),
|
|
'ix' => array(array('fs_dir','fs_active','fs_name')),
|
|
'uc' => array()
|
|
));
|
|
|
|
return $GLOBALS['setup_info']['phpgwapi']['currentver'] = '1.5.003';
|
|
}
|
|
|
|
$test[] = '1.5.003';
|
|
function phpgwapi_upgrade1_5_003()
|
|
{
|
|
// import the current egw_vfs into egw_sqlfs
|
|
// ToDo: moving /infolog and /infolog/$app to /apps in the files dir!!!
|
|
$debug = $GLOBALS['DEBUG'];
|
|
|
|
// delete the table in case this update runs multiple times
|
|
$GLOBALS['egw_setup']->db->delete('egw_vfs',false,__LINE__,__FILE__);
|
|
|
|
$query = $GLOBALS['egw_setup']->db->select('egw_vfs','*',"vfs_mime_type != 'journal' AND vfs_mime_type != 'journal-deleted'",__LINE__,__FILE__,false,'ORDER BY length(vfs_directory) ASC','phpgwapi');
|
|
if ($debug) echo "rows=<pre>\n";
|
|
|
|
$dirs = array();
|
|
foreach($query as $row)
|
|
{
|
|
// rename the /infolog dir to /apps/infolog and /infolog/$app /apps/$app
|
|
if (substr($row['vfs_directory'],0,8) == '/infolog')
|
|
{
|
|
$parts = explode('/',$row['vfs_directory']); // 0 = '', 1 = 'infolog', 2 = app or info_id
|
|
//$parts[1] = is_numeric($parts[2]) ? 'apps/infolog' : 'apps';
|
|
$parts[1] = $row['vfs_directory']=='/infolog' && is_numeric($row['vfs_name']) ? 'apps/infolog' : 'apps';
|
|
$row['vfs_directory'] = implode('/',$parts);
|
|
}
|
|
$nrow = array(
|
|
'fs_dir' => $dirs[$row['vfs_directory']],
|
|
'fs_name' => $row['vfs_name'],
|
|
'fs_mode' => $row['vfs_owner_id'] > 0 ?
|
|
($row['vfs_mime_type'] == 'Directory' ? 0700 : 0600) :
|
|
($row['vfs_mime_type'] == 'Directory' ? 0070 : 0060),
|
|
'fs_uid' => $row['vfs_owner_id'] > 0 ? $row['vfs_owner_id'] : 0,
|
|
'fs_gid' => $row['vfs_owner_id'] < 0 ? -$row['vfs_owner_id'] : 0,
|
|
'fs_created' => $row['vfs_created'],
|
|
'fs_modified' => $row['vfs_modified'] ? $row['vfs_modified'] : $row['vfs_created'],
|
|
'fs_mime' => $row['vfs_mime_type'] == 'Directory' ? 'httpd/unix-directory' :
|
|
($row['vfs_mime_type'] ? $row['vfs_mime_type'] : 'application/octet-stream'),
|
|
'fs_size' => $row['vfs_size'],
|
|
'fs_creator' => $row['vfs_createdby_id'],
|
|
'fs_modifier' => $row['vfs_modifedby_id'],
|
|
'fs_comment' => $row['vfs_comment'] ? $row['vfs_comment'] : null,
|
|
'fs_content' => $row['vfs_content'],
|
|
);
|
|
// rename the /infolog dir to /apps/infolog (create /apps)
|
|
if ($nrow['fs_dir'] == 1 && $nrow['fs_name'] == 'infolog')
|
|
{
|
|
$nrow['fs_name'] = 'apps';
|
|
$GLOBALS['egw_setup']->db->insert('egw_sqlfs',$nrow,false,__LINE__,__FILE__,'phpgwapi');
|
|
$dir = '/apps';
|
|
$nrow['fs_dir'] = $dirs[$dir] = $GLOBALS['egw_setup']->db->get_last_insert_id('egw_sqlfs','fs_id');
|
|
if ($debug) echo "<b>$dir = {$dirs[$dir]}</b>\n";
|
|
$nrow['fs_name'] = 'infolog';
|
|
$row['vfs_directory'] = '/apps';
|
|
}
|
|
if ($debug)
|
|
{
|
|
foreach($row as $key => $val)
|
|
{
|
|
if (is_numeric($key)) unset($row[$key]);
|
|
}
|
|
print_r($row);
|
|
print_r($nrow);
|
|
}
|
|
if ($row['vfs_mime_type'] == 'Directory')
|
|
{
|
|
$dir = ($row['vfs_directory'] == '/' ? '' : $row['vfs_directory']).'/'.$row['vfs_name'];
|
|
|
|
if (!isset($dirs[$dir])) // ignoring doublicate dirs, my devel box has somehow many of them specially /home
|
|
{
|
|
// fix some common perms
|
|
if(in_array($dir,array('/','/home')))
|
|
{
|
|
$nrow['fs_mode'] = 05; // everyone (other rights) can read the / and /home
|
|
$nrow['uid'] = $nrow['gid'] = 0; // owner root != any eGW user
|
|
}
|
|
$GLOBALS['egw_setup']->db->insert('egw_sqlfs',$nrow,false,__LINE__,__FILE__,'phpgwapi');
|
|
$dirs[$dir] = $GLOBALS['egw_setup']->db->get_last_insert_id('egw_sqlfs','fs_id');
|
|
if ($debug) echo "<b>$dir = {$dirs[$dir]}</b>\n";
|
|
}
|
|
elseif ($debug)
|
|
{
|
|
echo "<b>ignoring doublicate directory '$dir'!</b>\n";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$GLOBALS['egw_setup']->db->insert('egw_sqlfs',$nrow,false,__LINE__,__FILE__,'phpgwapi');
|
|
}
|
|
|
|
}
|
|
if ($debug)
|
|
{
|
|
echo "dirs=";
|
|
print_r($dirs);
|
|
echo "</pre>\n";
|
|
}
|
|
return $GLOBALS['setup_info']['phpgwapi']['currentver'] = '1.5.004';
|
|
}
|
|
|
|
$test[] = '1.5.004';
|
|
function phpgwapi_upgrade1_5_004()
|
|
{
|
|
// convert the filemanager group grants into extended ACL
|
|
|
|
// delete all sqlfs entries from the ACL table, in case we run multiple times
|
|
$GLOBALS['egw_setup']->db->delete('egw_acl',array('acl_appname' => sqlfs_stream_wrapper::EACL_APPNAME),__LINE__,__FILE__);
|
|
|
|
$GLOBALS['egw_setup']->setup_account_object();
|
|
$accounts = $GLOBALS['egw_setup']->accounts;
|
|
$accounts = new accounts();
|
|
|
|
egw_vfs::$is_root = true; // we need root rights to set the extended acl, without being the owner
|
|
|
|
foreach($GLOBALS['egw_setup']->db->select('egw_acl','*',array(
|
|
'acl_appname' => 'filemanager',
|
|
"acl_location != 'run'",
|
|
),__LINE__,__FILE__) as $row)
|
|
{
|
|
$rights = egw_vfs::READABLE | egw_vfs::EXECUTABLE;
|
|
if($row['acl_rights'] > 1) $rights |= egw_vfs::WRITABLE;
|
|
|
|
if (($lid = $accounts->id2name($row['acl_account'])) && $accounts->exists($row['acl_location']))
|
|
{
|
|
$ret = sqlfs_stream_wrapper::eacl('/home/'.$lid,$rights,(int)$row['acl_location']);
|
|
//echo "<p>sqlfs_stream_wrapper::eacl('/home/$lid',$rights,$row[acl_location])=$ret</p>\n";
|
|
}
|
|
}
|
|
egw_vfs::$is_root = false;
|
|
|
|
return $GLOBALS['setup_info']['phpgwapi']['currentver'] = '1.5.005';
|
|
}
|
|
|
|
$test[] = '1.5.005';
|
|
function phpgwapi_upgrade1_5_005()
|
|
{
|
|
// move /infolog/$app to /apps/$app and /infolog to /apps/infolog
|
|
|
|
$files_dir = $GLOBALS['egw_setup']->db->select('egw_config','config_value',array(
|
|
'config_name' => 'files_dir',
|
|
'config_app' => 'phpgwapi',
|
|
),__LINE__,__FILE__)->fetchSingle();
|
|
|
|
if ($files_dir && file_exists($files_dir) && file_exists($files_dir.'/infolog'))
|
|
{
|
|
mkdir($files_dir.'/apps',0700,true);
|
|
if (($dir = opendir($files_dir.'/infolog')))
|
|
{
|
|
while(($app = readdir($dir)))
|
|
{
|
|
if (!is_numeric($app) && $app[0] != '.') // ingore infolog entries and . or ..
|
|
{
|
|
rename($files_dir.'/infolog/'.$app,$files_dir.'/apps/'.$app);
|
|
}
|
|
}
|
|
closedir($dir);
|
|
rename($files_dir.'/infolog',$files_dir.'/apps/infolog');
|
|
}
|
|
}
|
|
|
|
return $GLOBALS['setup_info']['phpgwapi']['currentver'] = '1.5.006';
|
|
}
|
|
|