2013-02-26 01:09:40 +00:00
< ? php /** @file */
2010-07-05 10:33:02 +00:00
2013-08-08 00:51:10 +00:00
function group_add ( $uid , $name , $public = 0 ) {
2010-07-13 06:08:07 +00:00
2010-07-05 10:33:02 +00:00
$ret = false ;
if ( x ( $uid ) && x ( $name )) {
$r = group_byname ( $uid , $name ); // check for dups
2011-09-18 13:20:18 +00:00
if ( $r !== false ) {
// This could be a problem.
// Let's assume we've just created a group which we once deleted
// all the old members are gone, but the group remains so we don't break any security
// access lists. What we're doing here is reviving the dead group, but old content which
// was restricted to this group may now be seen by the new group members.
2013-12-23 02:37:39 +00:00
$z = q ( " SELECT * FROM `groups` WHERE `id` = %d LIMIT 1 " ,
2011-09-18 13:20:18 +00:00
intval ( $r )
);
if ( count ( $z ) && $z [ 0 ][ 'deleted' ]) {
2013-12-23 02:37:39 +00:00
$r = q ( " UPDATE `groups` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s' LIMIT 1 " ,
2011-09-18 13:20:18 +00:00
intval ( $uid ),
dbesc ( $name )
);
notice ( t ( 'A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name.' ) . EOL );
}
2010-07-05 10:33:02 +00:00
return true ;
2011-09-18 13:20:18 +00:00
}
2012-12-07 03:18:38 +00:00
do {
$dups = false ;
$hash = random_string () . $name ;
2013-12-23 02:37:39 +00:00
$r = q ( " SELECT id FROM `groups` WHERE hash = '%s' LIMIT 1 " , dbesc ( $hash ));
2012-12-14 23:08:55 +00:00
if ( $r )
2012-12-07 03:18:38 +00:00
$dups = true ;
} while ( $dups == true );
2013-12-23 02:37:39 +00:00
$r = q ( " INSERT INTO `groups` ( hash, uid, visible, name )
2013-08-08 00:51:10 +00:00
VALUES ( '%s' , % d , % d , '%s' ) " ,
2012-12-07 03:18:38 +00:00
dbesc ( $hash ),
2010-07-05 10:33:02 +00:00
intval ( $uid ),
2013-08-08 00:51:10 +00:00
intval ( $public ),
2010-07-05 10:33:02 +00:00
dbesc ( $name )
);
$ret = $r ;
}
2014-07-14 09:37:41 +00:00
build_sync_packet ( $uid , null , true );
2010-07-05 10:33:02 +00:00
return $ret ;
}
function group_rmv ( $uid , $name ) {
$ret = false ;
if ( x ( $uid ) && x ( $name )) {
2013-12-23 02:37:39 +00:00
$r = q ( " SELECT id, hash FROM `groups` WHERE `uid` = %d AND `name` = '%s' LIMIT 1 " ,
2010-07-05 10:33:02 +00:00
intval ( $uid ),
dbesc ( $name )
2010-07-11 09:52:47 +00:00
);
2013-03-28 02:35:34 +00:00
if ( $r ) {
2010-07-05 10:33:02 +00:00
$group_id = $r [ 0 ][ 'id' ];
2013-03-28 02:35:34 +00:00
$group_hash = $r [ 0 ][ 'hash' ];
}
2010-07-05 10:33:02 +00:00
if ( ! $group_id )
return false ;
2012-10-02 01:02:11 +00:00
// remove group from default posting lists
2013-03-28 02:35:34 +00:00
$r = q ( " SELECT channel_default_group, channel_allow_gid, channel_deny_gid FROM channel WHERE channel_id = %d LIMIT 1 " ,
2012-10-02 01:02:11 +00:00
intval ( $uid )
);
if ( $r ) {
$user_info = $r [ 0 ];
$change = false ;
2013-03-28 02:35:34 +00:00
if ( $user_info [ 'channel_default_group' ] == $group_hash ) {
$user_info [ 'channel_default_group' ] = '' ;
2012-10-02 01:02:11 +00:00
$change = true ;
}
2012-11-15 02:18:28 +00:00
if ( strpos ( $user_info [ 'channel_allow_gid' ], '<' . $group_id . '>' ) !== false ) {
2013-03-28 02:35:34 +00:00
$user_info [ 'channel_allow_gid' ] = str_replace ( '<' . $group_hash . '>' , '' , $user_info [ 'channel_allow_gid' ]);
2012-10-02 01:02:11 +00:00
$change = true ;
}
2012-11-15 02:18:28 +00:00
if ( strpos ( $user_info [ 'channel_deny_gid' ], '<' . $group_id . '>' ) !== false ) {
2013-03-28 02:35:34 +00:00
$user_info [ 'channel_deny_gid' ] = str_replace ( '<' . $group_hash . '>' , '' , $user_info [ 'channel_deny_gid' ]);
2012-10-02 01:02:11 +00:00
$change = true ;
}
if ( $change ) {
2013-03-28 02:35:34 +00:00
q ( " UPDATE channel SET channel_default_group = '%s', channel_allow_gid = '%s', channel_deny_gid = '%s'
2012-11-15 02:18:28 +00:00
WHERE channel_id = % d " ,
2013-03-28 02:35:34 +00:00
intval ( $user_info [ 'channel_default_group' ]),
2012-11-15 02:18:28 +00:00
dbesc ( $user_info [ 'channel_allow_gid' ]),
dbesc ( $user_info [ 'channel_deny_gid' ]),
2012-10-02 01:02:11 +00:00
intval ( $uid )
);
}
}
2010-07-05 10:33:02 +00:00
// remove all members
$r = q ( " DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d " ,
intval ( $uid ),
intval ( $group_id )
);
// remove group
2013-12-23 02:37:39 +00:00
$r = q ( " UPDATE `groups` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s' LIMIT 1 " ,
2010-07-05 10:33:02 +00:00
intval ( $uid ),
dbesc ( $name )
);
$ret = $r ;
}
2014-07-14 09:37:41 +00:00
build_sync_packet ( $uid , null , true );
2010-07-05 10:33:02 +00:00
return $ret ;
}
function group_byname ( $uid , $name ) {
if (( ! $uid ) || ( ! strlen ( $name )))
return false ;
2013-12-23 02:37:39 +00:00
$r = q ( " SELECT * FROM `groups` WHERE `uid` = %d AND `name` = '%s' LIMIT 1 " ,
2010-07-05 10:33:02 +00:00
intval ( $uid ),
dbesc ( $name )
);
if ( count ( $r ))
return $r [ 0 ][ 'id' ];
return false ;
}
2013-03-28 02:35:34 +00:00
function group_rec_byhash ( $uid , $hash ) {
if (( ! $uid ) || ( ! strlen ( $hash )))
return false ;
2013-12-23 02:37:39 +00:00
$r = q ( " SELECT * FROM `groups` WHERE `uid` = %d AND `hash` = '%s' LIMIT 1 " ,
2013-03-28 02:35:34 +00:00
intval ( $uid ),
dbesc ( $hash )
);
if ( $r )
return $r [ 0 ];
return false ;
}
2010-07-05 10:33:02 +00:00
function group_rmv_member ( $uid , $name , $member ) {
$gid = group_byname ( $uid , $name );
if ( ! $gid )
return false ;
if ( ! ( $uid && $gid && $member ))
return false ;
2012-11-15 02:18:28 +00:00
$r = q ( " DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND xchan = '%s' LIMIT 1 " ,
2010-07-05 10:33:02 +00:00
intval ( $uid ),
intval ( $gid ),
2012-11-15 02:18:28 +00:00
dbesc ( $member )
2010-07-05 10:33:02 +00:00
);
2014-07-14 09:37:41 +00:00
build_sync_packet ( $uid , null , true );
2010-07-05 10:33:02 +00:00
return $r ;
}
2012-05-18 05:44:52 +00:00
function group_add_member ( $uid , $name , $member , $gid = 0 ) {
if ( ! $gid )
$gid = group_byname ( $uid , $name );
2010-07-05 10:33:02 +00:00
if (( ! $gid ) || ( ! $uid ) || ( ! $member ))
return false ;
2012-11-15 02:18:28 +00:00
$r = q ( " SELECT * FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `xchan` = '%s' LIMIT 1 " ,
2010-07-05 10:33:02 +00:00
intval ( $uid ),
intval ( $gid ),
2012-11-15 02:18:28 +00:00
dbesc ( $member )
2010-07-05 10:33:02 +00:00
);
if ( count ( $r ))
return true ; // You might question this, but
2011-11-23 09:44:07 +00:00
// we indicate success because the group member was in fact created
2010-07-05 10:33:02 +00:00
// -- It was just created at another time
if ( ! count ( $r ))
2012-11-15 02:18:28 +00:00
$r = q ( " INSERT INTO `group_member` (`uid`, `gid`, `xchan`)
2012-11-15 04:55:05 +00:00
VALUES ( % d , % d , '%s' ) " ,
2010-07-05 10:33:02 +00:00
intval ( $uid ),
intval ( $gid ),
2012-11-15 02:18:28 +00:00
dbesc ( $member )
2010-07-05 10:33:02 +00:00
);
2014-07-14 09:37:41 +00:00
build_sync_packet ( $uid , null , true );
2010-07-05 10:33:02 +00:00
return $r ;
2010-07-11 09:52:47 +00:00
}
2010-07-13 06:08:07 +00:00
function group_get_members ( $gid ) {
$ret = array ();
if ( intval ( $gid )) {
2013-01-23 04:13:20 +00:00
$r = q ( " SELECT * FROM `group_member`
2012-11-15 02:18:28 +00:00
LEFT JOIN abook ON abook_xchan = `group_member` . `xchan` left join xchan on xchan_hash = abook_xchan
2014-02-07 20:28:39 +00:00
WHERE `gid` = % d AND abook_channel = % d and `group_member` . `uid` = % d and not ( xchan_flags & % d ) and not ( abook_flags & % d ) and not ( abook_flags & % d ) ORDER BY xchan_name ASC " ,
2010-07-13 06:08:07 +00:00
intval ( $gid ),
2012-11-15 04:55:05 +00:00
intval ( local_user ()),
2013-05-03 03:51:58 +00:00
intval ( local_user ()),
2014-02-07 20:28:39 +00:00
intval ( XCHAN_FLAGS_DELETED ),
2012-11-30 07:06:03 +00:00
intval ( ABOOK_FLAG_BLOCKED ),
intval ( ABOOK_FLAG_PENDING )
2010-07-13 06:08:07 +00:00
);
if ( count ( $r ))
$ret = $r ;
}
return $ret ;
}
2013-11-22 01:23:14 +00:00
function mini_group_select ( $uid , $group = '' ) {
2012-05-18 05:44:52 +00:00
$grps = array ();
$o = '' ;
2013-12-23 02:37:39 +00:00
$r = q ( " SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC " ,
2012-05-18 05:44:52 +00:00
intval ( $uid )
);
2013-11-22 01:23:14 +00:00
$grps [] = array ( 'name' => '' , 'hash' => '0' , 'selected' => '' );
2012-05-18 05:44:52 +00:00
if ( count ( $r )) {
foreach ( $r as $rr ) {
2013-11-22 01:23:14 +00:00
$grps [] = array ( 'name' => $rr [ 'name' ], 'id' => $rr [ 'hash' ], 'selected' => (( $group == $rr [ 'hash' ]) ? 'true' : '' ));
2012-05-18 05:44:52 +00:00
}
}
2012-11-03 09:34:12 +00:00
logger ( 'mini_group_select: ' . print_r ( $grps , true ), LOGGER_DATA );
2012-05-18 05:44:52 +00:00
2012-05-18 08:38:11 +00:00
$o = replace_macros ( get_markup_template ( 'group_selection.tpl' ), array (
'$label' => t ( 'Default privacy group for new contacts' ),
'$groups' => $grps
));
2012-05-18 05:44:52 +00:00
return $o ;
}
2010-07-11 09:52:47 +00:00
2013-12-20 07:56:37 +00:00
function group_side ( $every = " connections " , $each = " group " , $edit = false , $group_id = 0 , $cid = '' , $mode = 1 ) {
2010-07-11 09:52:47 +00:00
2010-10-31 23:38:22 +00:00
$o = '' ;
2010-07-11 09:52:47 +00:00
if ( ! local_user ())
2010-10-31 23:38:22 +00:00
return '' ;
2010-07-28 02:27:14 +00:00
2011-11-21 11:34:22 +00:00
$groups = array ();
$groups [] = array (
2013-03-05 04:58:39 +00:00
'text' => t ( 'All Channels' ),
2011-12-01 07:01:42 +00:00
'id' => 0 ,
2011-11-21 11:34:22 +00:00
'selected' => (( $group_id == 0 ) ? 'group-selected' : '' ),
'href' => $every ,
);
2010-07-11 09:52:47 +00:00
2010-07-11 13:06:30 +00:00
2013-12-23 02:37:39 +00:00
$r = q ( " SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC " ,
2010-07-11 09:52:47 +00:00
intval ( $_SESSION [ 'uid' ])
);
2011-11-21 11:34:22 +00:00
$member_of = array ();
2011-08-03 05:39:35 +00:00
if ( $cid ) {
$member_of = groups_containing ( local_user (), $cid );
}
2010-07-11 09:52:47 +00:00
if ( count ( $r )) {
2011-07-01 13:26:46 +00:00
foreach ( $r as $rr ) {
2011-09-23 10:12:31 +00:00
$selected = (( $group_id == $rr [ 'id' ]) ? ' group-selected' : '' );
2011-11-21 11:34:22 +00:00
if ( $edit ) {
$groupedit = array (
'href' => " group/ " . $rr [ 'id' ],
'title' => t ( 'edit' ),
);
} else {
$groupedit = null ;
}
$groups [] = array (
'id' => $rr [ 'id' ],
2014-09-11 09:19:21 +00:00
'enc_cid' => base64url_encode ( $cid ),
2011-11-21 11:34:22 +00:00
'cid' => $cid ,
'text' => $rr [ 'name' ],
'selected' => $selected ,
2014-01-22 16:18:40 +00:00
'href' => (( $mode == 0 ) ? $each . '?f=&gid=' . $rr [ 'id' ] : $each . " / " . $rr [ 'id' ]) . (( x ( $_GET , 'new' )) ? '&new=' . $_GET [ 'new' ] : '' ) . (( x ( $_GET , 'order' )) ? '&order=' . $_GET [ 'order' ] : '' ),
2011-11-21 11:34:22 +00:00
'edit' => $groupedit ,
'ismember' => in_array ( $rr [ 'id' ], $member_of ),
);
2011-07-01 13:26:46 +00:00
}
2010-07-11 09:52:47 +00:00
}
2011-07-02 09:47:01 +00:00
2011-11-21 11:34:22 +00:00
$tpl = get_markup_template ( " group_side.tpl " );
$o = replace_macros ( $tpl , array (
2012-11-03 09:34:12 +00:00
'$title' => t ( 'Collections' ),
'$edittext' => t ( 'Edit collection' ),
'$createtext' => t ( 'Create a new collection' ),
'$ungrouped' => (( $every === 'contacts' ) ? t ( 'Channels not in any collection' ) : '' ),
2011-11-21 11:34:22 +00:00
'$groups' => $groups ,
'$add' => t ( 'add' ),
));
2010-07-11 09:52:47 +00:00
return $o ;
2010-07-15 06:04:10 +00:00
}
function expand_groups ( $a ) {
if ( ! ( is_array ( $a ) && count ( $a )))
return array ();
2013-05-28 23:32:31 +00:00
$x = $a ;
2013-11-05 22:26:31 +00:00
stringify_array_elms ( $x , true );
2013-05-28 23:32:31 +00:00
$groups = implode ( ',' , $x );
2013-11-05 22:26:31 +00:00
2013-05-28 23:32:31 +00:00
if ( $groups )
2013-12-23 02:37:39 +00:00
$r = q ( " SELECT xchan FROM group_member WHERE gid IN ( select id from `groups` where hash in ( $groups )) " );
2010-07-15 06:04:10 +00:00
$ret = array ();
2013-11-05 22:26:31 +00:00
2013-05-28 23:32:31 +00:00
if ( $r )
2010-07-15 06:04:10 +00:00
foreach ( $r as $rr )
2012-11-15 02:18:28 +00:00
$ret [] = $rr [ 'xchan' ];
2010-07-15 06:04:10 +00:00
return $ret ;
}
2011-06-01 02:24:26 +00:00
function member_of ( $c ) {
2013-12-23 02:37:39 +00:00
$r = q ( " SELECT `groups`.`name`, `groups`.`id` FROM `groups` LEFT JOIN `group_member` ON `group_member`.`gid` = `groups`.`id` WHERE `group_member`.`xchan` = '%s' AND `groups`.`deleted` = 0 ORDER BY `groups`.`name` ASC " ,
2012-11-15 02:18:28 +00:00
dbesc ( $c )
2011-06-01 02:24:26 +00:00
);
return $r ;
}
2011-08-03 05:39:35 +00:00
function groups_containing ( $uid , $c ) {
2012-11-15 02:18:28 +00:00
$r = q ( " SELECT `gid` FROM `group_member` WHERE `uid` = %d AND `group_member`.`xchan` = '%s' " ,
2011-08-03 05:39:35 +00:00
intval ( $uid ),
2012-11-15 02:18:28 +00:00
dbesc ( $c )
2011-08-03 05:39:35 +00:00
);
$ret = array ();
if ( count ( $r )) {
foreach ( $r as $rr )
$ret [] = $rr [ 'gid' ];
}
return $ret ;
2011-11-21 11:34:22 +00:00
}