2001-07-12 01:17:32 +02:00
< ? php
/************************************************************************** \
* phpGroupWare - InfoLog *
* http :// www . phpgroupware . org *
* Written by Ralf Becker < RalfBecker @ outdoor - training . de > *
* originaly based on todo written by Joseph Engo < jengo @ phpgroupware . 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$ */
class soinfolog // DB-Layer
{
var $db , $db2 ;
var $grants ;
var $data = array ( );
2001-07-15 23:42:17 +02:00
var $filters = array ( );
2001-10-03 20:56:42 +02:00
var $user ;
2001-07-19 01:54:43 +02:00
var $maybe_slashes = array (
'info_des' => 1 , 'info_subject' => 1 , 'info_from' => 1 , 'info_addr' => 1
);
2001-07-14 23:44:01 +02:00
function soinfolog ( $info_id = 0 )
{
2001-10-03 20:56:42 +02:00
$this -> db = $GLOBALS [ 'phpgw' ] -> db ;
$this -> grants = $GLOBALS [ 'phpgw' ] -> acl -> get_grants ( 'infolog' );
$this -> user = $GLOBALS [ 'phpgw_info' ][ 'user' ][ 'account_id' ];
2002-09-01 22:41:36 +02:00
$this -> links = CreateObject ( 'infolog.solink' );
2001-07-14 23:44:01 +02:00
$this -> read ( $info_id );
2001-07-12 01:17:32 +02:00
}
2001-07-14 23:44:01 +02:00
function check_access ( $info_id , $required_rights )
{
if ( $info_id != $this -> data [ 'info_id' ]) // already loaded?
{
// dont change our own internal data,
// dont use new as it changes $phpgw->db
$private_info = $this ;
2001-07-12 01:17:32 +02:00
$info = $private_info -> read ( $info_id );
2001-07-14 23:44:01 +02:00
}
else
{
2001-07-12 01:17:32 +02:00
$info = $this -> data ;
}
if ( ! $info || ! $info_id )
2001-07-14 23:44:01 +02:00
{
2001-07-12 01:17:32 +02:00
return False ;
2001-07-14 23:44:01 +02:00
}
2001-07-12 01:17:32 +02:00
$owner = $info [ 'info_owner' ];
2001-07-14 23:44:01 +02:00
2001-10-03 20:56:42 +02:00
$access_ok = $owner == $this -> user || // user has all rights
2001-07-14 23:44:01 +02:00
// ACL only on public entrys || $owner granted _PRIVATE
!! ( $this -> grants [ $owner ] & $required_rights ) &&
( $info [ 'info_access' ] == 'public' ||
!! ( $this -> grants [ $owner ] & PHPGW_ACL_PRIVATE ));
2001-07-12 01:17:32 +02:00
// echo "check_access(info_id=$info_id (owner=$owner, user=$user),required_rights=$required_rights): access".($access_ok?"Ok":"Denied");
return $access_ok ;
}
2001-07-14 23:44:01 +02:00
// sql to be AND into a query to ensure ACL is respected (incl. _PRIVATE)
2001-07-15 23:42:17 +02:00
// filter: none|all - list all entrys user have rights to see
// private|own - list only his personal entrys
2001-07-14 23:44:01 +02:00
// (incl. those he is responsible for !!!)
function aclFilter ( $filter = 'none' )
{
2001-07-15 23:42:17 +02:00
ereg ( '.*(own|privat|all|none).*' , $filter , $vars );
$filter = $vars [ 1 ];
2001-07-12 01:17:32 +02:00
if ( isset ( $this -> acl_filter [ $filter ]))
2001-07-14 23:44:01 +02:00
{
return $this -> acl_filter [ $filter ]; // used cached filter if found
}
if ( is_array ( $this -> grants ))
{
while ( list ( $user , $grant ) = each ( $this -> grants ))
{
// echo "<p>grants: user=$user, grant=$grant</p>";
2001-07-12 01:17:32 +02:00
if ( $grant & ( PHPGW_ACL_READ | PHPGW_ACL_EDIT ))
2001-07-14 23:44:01 +02:00
{
2001-07-12 01:17:32 +02:00
$public_user_list [] = $user ;
2001-07-14 23:44:01 +02:00
}
2001-07-12 01:17:32 +02:00
if ( $grant & PHPGW_ACL_PRIVATE )
2001-07-14 23:44:01 +02:00
{
2001-07-12 01:17:32 +02:00
$private_user_list [] = $user ;
2001-07-14 23:44:01 +02:00
}
2001-07-12 01:17:32 +02:00
}
2001-07-14 23:44:01 +02:00
if ( count ( $private_user_list ))
{
$has_private_access = 'info_owner IN (' .
implode ( ',' , $private_user_list ) . ')' ;
2001-07-12 01:17:32 +02:00
}
}
2001-10-03 20:56:42 +02:00
$filtermethod = " (info_owner= $this->user " ; // user has all rights
2001-07-12 01:17:32 +02:00
2001-07-14 23:44:01 +02:00
// private: own entries plus the one user is responsible for
2001-07-15 23:42:17 +02:00
if ( $filter == 'private' || $filter == 'own' )
2001-07-14 23:44:01 +02:00
{
2001-10-04 21:04:58 +02:00
$filtermethod .= " OR (info_responsible= $this->user OR info_status = 'offer') " .
" AND (info_access='public' " . ( $has_private_access ? " OR $has_private_access " : '' ) . ')' ;
2001-07-14 23:44:01 +02:00
}
else // none --> all entrys user has rights to see
{
if ( $has_private_access )
{
2001-07-12 01:17:32 +02:00
$filtermethod .= " OR $has_private_access " ;
}
2001-07-14 23:44:01 +02:00
if ( count ( $public_user_list ))
{
2001-07-12 01:17:32 +02:00
$filtermethod .= " OR (info_access='public' AND info_owner IN( " . implode ( ',' , $public_user_list ) . '))' ;
}
}
$filtermethod .= ') ' ;
2001-07-14 23:44:01 +02:00
return $this -> acl_filter [ $filter ] = $filtermethod ; // cache the filter
2001-07-12 01:17:32 +02:00
}
2001-07-15 23:42:17 +02:00
function statusFilter ( $filter = '' )
{
ereg ( '.*(done|open|offer).*' , $filter , $vars );
$filter = $vars [ 1 ];
switch ( $filter )
{
case 'done' : return " AND info_status IN ('done','billed') " ;
case 'open' : return " AND NOT (info_status IN ('done','billed')) " ;
case 'offer' : return " AND info_status = 'offer' " ;
}
return '' ;
}
function dateFilter ( $filter = '' )
{
ereg ( '.*(upcoming|today|overdue).*' , $filter , $vars );
$filter = $vars [ 1 ];
$now = getdate ( time ());
$tomorrow = mktime ( 0 , 0 , 0 , $now [ 'mon' ], $now [ 'mday' ] + 1 , $now [ 'year' ]);
switch ( $filter )
{
case 'upcoming' : return " AND info_startdate >= ' $tomorrow ' " ;
case 'today' : return " AND info_startdate < ' $tomorrow ' " ;
case 'overdue' : return " AND (info_enddate != 0 AND info_enddate < ' $tomorrow ') " ;
}
return '' ;
}
2001-07-14 23:44:01 +02:00
function init ()
{
2001-10-03 20:56:42 +02:00
$this -> data = array ( 'info_owner' => $this -> user ,
2001-07-12 01:17:32 +02:00
'info_pri' => 'normal' );
}
2001-07-14 23:44:01 +02:00
function read ( $info_id ) // did _not_ ensure ACL
{
2001-07-12 01:17:32 +02:00
if ( $info_id <= 0 || $info_id != $this -> data [ 'info_id' ] &&
( ! $this -> db -> query ( " select * FROM phpgw_infolog where info_id=' $info_id ' " ) || ! $this -> db -> next_record ()))
{
$this -> init ( );
return False ;
}
2001-07-14 23:44:01 +02:00
if ( $info_id != $this -> data [ 'info_id' ]) // data yet read in
{
2001-07-12 01:17:32 +02:00
$this -> data = $this -> db -> Record ;
2001-07-19 01:54:43 +02:00
reset ( $this -> maybe_slashes );
while ( list ( $key ) = each ( $this -> maybe_slashes ))
{
$this -> data [ $key ] = stripslashes ( $this -> data [ $key ]);
}
2002-09-01 22:41:36 +02:00
$links = $this -> links -> get_links ( 'infolog' , $this -> data [ 'info_id' ]);
while ( list ( $nul , $link ) = each ( $links ))
{
if ( $link [ 'app' ] == 'addressbook' )
$this -> data [ 'info_addr_id' ] = $link [ 'id' ];
if ( $link [ 'app' ] == 'projects' )
$this -> data [ 'info_proj_id' ] = $link [ 'id' ];
if ( $link [ 'app' ] == 'calendar' )
$this -> data [ 'info_event_id' ] = $link [ 'id' ];
}
2001-07-19 01:54:43 +02:00
}
2001-07-12 01:17:32 +02:00
return $this -> data ;
}
2001-07-14 23:44:01 +02:00
function delete ( $info_id ) // did _not_ ensure ACL
{
2001-07-12 01:17:32 +02:00
$this -> db -> query ( " delete FROM phpgw_infolog where info_id=' $info_id ' or info_id_parent=' "
2001-10-03 20:56:42 +02:00
. " $info_id ' AND ((info_access='public' and info_owner != ' $this->user ') "
. " or (info_owner=' $this->user ')) " , __LINE__ , __FILE__ );
2001-07-12 01:17:32 +02:00
2002-09-01 22:41:36 +02:00
$this -> links -> unlink ( 0 , 'infolog' , $info_id );
2001-07-12 01:17:32 +02:00
if ( $this -> data [ 'info_id' ] == $info_id )
2001-07-14 23:44:01 +02:00
{
2001-07-12 01:17:32 +02:00
$this -> init ( );
2001-07-14 23:44:01 +02:00
}
2001-07-12 01:17:32 +02:00
}
2001-07-14 23:44:01 +02:00
function write ( $values ) // did _not_ ensure ACL
{
2002-10-08 02:10:18 +02:00
include ( PHPGW_SERVER_ROOT . '/infolog/setup/tables_current.inc.php' );
$db_cols = $phpgw_baseline [ 'phpgw_infolog' ][ 'fd' ];
unset ( $phpgw_baseline );
2001-07-14 23:44:01 +02:00
while ( list ( $key , $val ) = each ( $values ))
{
2001-07-19 01:54:43 +02:00
if ( $key != 'info_id' )
2001-07-14 23:44:01 +02:00
{
2002-10-08 02:10:18 +02:00
if ( ! isset ( $db_cols [ $key ]))
{
continue ; // not in infolog-table
}
2001-07-19 01:54:43 +02:00
$this -> data [ $key ] = $val ; // update internal data
if ( $this -> maybe_slashes [ $key ])
{
2001-07-12 01:17:32 +02:00
$val = addslashes ( $val );
2001-07-19 01:54:43 +02:00
}
2001-07-20 01:00:51 +02:00
$cols .= ( $cols ? ',' : '' ) . $key ;
$vals .= ( $vals ? ',' : '' ) . " ' $val ' " ;
$query .= ( $query ? ',' : '' ) . " $key =' $val ' " ;
2001-07-12 01:17:32 +02:00
}
}
2002-09-01 22:41:36 +02:00
if (( $this -> data [ 'info_id' ] = $values [ 'info_id' ]) > 0 )
2001-07-14 23:44:01 +02:00
{
2001-07-20 01:00:51 +02:00
$query = " UPDATE phpgw_infolog SET $query where info_id=' " . $values [ 'info_id' ] . " ' " ;
2002-09-01 22:41:36 +02:00
$this -> db -> query ( $query , __LINE__ , __FILE__ );
2001-07-14 23:44:01 +02:00
}
else
{
2001-07-20 01:00:51 +02:00
$query = " INSERT INTO phpgw_infolog ( $cols ) VALUES ( $vals ) " ;
2001-10-03 20:56:42 +02:00
$this -> db -> query ( $query , __LINE__ , __FILE__ );
$this -> data [ 'info_id' ] = $this -> db -> get_last_insert_id ( 'phpgw_infolog' , 'info_id' );
2001-07-20 01:00:51 +02:00
}
2002-09-01 22:41:36 +02:00
// echo "<p>soinfolog.write values= "; _debug_array($values);
// echo "<p>soinfolog.write this->data= "; _debug_array($this->data);
2002-10-08 02:10:18 +02:00
/*
2002-09-01 22:41:36 +02:00
if ( $this -> data [ 'info_addr_id' ])
$this -> links -> link ( 'infolog' , $this -> data [ 'info_id' ], 'addressbook' , $this -> data [ 'info_addr_id' ]);
if ( $this -> data [ 'info_proj_id' ])
$this -> links -> link ( 'infolog' , $this -> data [ 'info_id' ], 'projects' , $this -> data [ 'info_proj_id' ]);
if ( $this -> data [ 'info_event_id' ])
2002-10-08 02:10:18 +02:00
$this -> links -> link ( 'infolog' , $this -> data [ 'info_id' ], 'calendar' , $this -> data [ 'info_event_id' ]); */
2001-07-12 01:17:32 +02:00
}
2001-07-14 23:44:01 +02:00
function anzSubs ( $info_id )
{
$this -> db -> query ( 'select count(*) FROM phpgw_infolog where ' .
" info_id_parent= $info_id " , __LINE__ , __FILE__ );
$this -> db -> next_record ();
return $this -> db -> f ( 0 );
}
2002-05-01 19:16:27 +02:00
function readIdArray ( $order , $sort , $filter , $cat_id , $query , $action , $action_id ,
$ordermethod , & $start , & $total )
2001-07-14 23:44:01 +02:00
{
2002-09-01 22:41:36 +02:00
//echo "<p>soinfolog.readIdArray(action='$action',action_id='$action_id')</p>\n";
$action2app = array (
2002-10-14 02:39:47 +02:00
'addr' => 'addressbook' ,
'addressbook' => 'addressbook' ,
'proj' => 'projects' ,
'projects' => 'projects' ,
'event' => 'calendar' ,
'calendar' => 'calendar'
2002-09-01 22:41:36 +02:00
);
2002-10-14 02:39:47 +02:00
if ( $action != '' && isset ( $action2app [ $action ]))
2002-09-01 22:41:36 +02:00
{
$links = $this -> links -> get_links ( $action2app [ $action ], $action_id );
2002-10-14 02:39:47 +02:00
$total = count ( $links );
if ( $start > $total )
{
$start = 0 ;
}
2002-09-01 22:41:36 +02:00
$ids = array ();
2002-10-14 02:39:47 +02:00
while ( list ( $n , $link ) = each ( $links ) &&
$n < $start + $GLOBALS [ 'phpgw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'maxmatchs' ])
2002-09-01 22:41:36 +02:00
{
2002-10-14 02:39:47 +02:00
if ( $n >= $start )
{
$ids [ '' . $link [ 'id' ]] = 0 ;
}
2002-09-01 22:41:36 +02:00
}
//echo "<p>soinfolog.readIdArray($action,$action_id) ids ="; _debug_array($ids);
return $ids ;
}
2001-07-14 23:44:01 +02:00
if ( $order )
{
2002-10-14 02:39:47 +02:00
$ordermethod = 'ORDER BY ' . $order . ' ' . $sort ;
2001-07-14 23:44:01 +02:00
}
else
{
2002-10-14 02:39:47 +02:00
$ordermethod = 'ORDER BY info_datemodified DESC' ; // newest first
2001-07-14 23:44:01 +02:00
}
$filtermethod = $this -> aclFilter ( $filter );
2001-07-15 23:42:17 +02:00
$filtermethod .= $this -> statusFilter ( $filter );
$filtermethod .= $this -> dateFilter ( $filter );
// echo "<p>filtermethod='$filtermethod'</p>";
2001-07-14 23:44:01 +02:00
if ( $cat_id )
{
2002-09-01 22:41:36 +02:00
$filtermethod .= " AND info_cat=' $cat_id ' " ;
2001-07-14 23:44:01 +02:00
}
2002-10-14 02:39:47 +02:00
/* not longer used
2001-07-14 23:44:01 +02:00
switch ( $action )
{
2002-05-01 19:16:27 +02:00
case 'addr' : $filtermethod .= " AND info_addr_id= $action_id " ;
2001-07-14 23:44:01 +02:00
break ;
2002-05-01 19:16:27 +02:00
case 'proj' : $filtermethod .= " AND info_proj_id= $action_id " ;
2001-07-14 23:44:01 +02:00
break ;
2002-05-12 09:14:01 +02:00
case 'event' : $filtermethod .= " AND info_event_id= $action_id " ;
break ;
2001-07-14 23:44:01 +02:00
}
2002-10-14 02:39:47 +02:00
*/
2001-07-14 23:44:01 +02:00
if ( $query ) // we search in _from, _subject and _des for $query
{
$sql_query = " AND (info_from like '% $query %' OR info_subject " .
2002-10-14 02:39:47 +02:00
" LIKE '% $query %' OR info_des LIKE '% $query %') " ;
2001-07-14 23:44:01 +02:00
}
2002-05-01 19:16:27 +02:00
$pid = 'AND info_id_parent=' . ( $action == 'sp' ? $action_id : 0 );
2001-07-14 23:44:01 +02:00
if ( ! $phpgw_info [ 'user' ][ 'preferences' ][ 'infolog' ][ 'listNoSubs' ] &&
$action != 'sp' )
{
$pid = '' ;
}
$this -> db -> query ( " SELECT COUNT(*) FROM phpgw_infolog WHERE $filtermethod $pid $sql_query " , __LINE__ , __FILE__ );
$this -> db -> next_record ();
$total = $this -> db -> f ( 0 );
if ( ! $start || $start > $total )
{
$start = 0 ;
}
2002-10-14 02:39:47 +02:00
$this -> db -> limit_query ( $sql = " SELECT info_id,info_id_parent FROM phpgw_infolog WHERE $filtermethod $pid $sql_query $ordermethod " , $start , __LINE__ , __FILE__ );
2001-07-14 23:44:01 +02:00
$ids = array ( );
while ( $this -> db -> next_record ())
{
2001-07-26 00:02:46 +02:00
$ids [ $this -> db -> f ( 'info_id' )] = $this -> db -> f ( 'info_id_parent' );
2001-07-14 23:44:01 +02:00
}
return $ids ;
}
2001-07-12 01:17:32 +02:00
}