2018-07-03 23:40:54 +00:00
< ? php
namespace Zotlabs\Lib ;
use Zotlabs\Lib\Libsync ;
class Group {
static function add ( $uid , $name , $public = 0 ) {
$ret = false ;
if ( x ( $uid ) && x ( $name )) {
$r = self :: byname ( $uid , $name ); // check for dups
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.
$z = q ( " SELECT * FROM groups WHERE id = %d LIMIT 1 " ,
intval ( $r )
);
if (( $z ) && $z [ 0 ][ 'deleted' ]) {
q ( 'UPDATE groups SET deleted = 0 WHERE id = %d' , intval ( $z [ 0 ][ 'id' ]));
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 );
}
return true ;
}
do {
$dups = false ;
$hash = random_string ( 32 ) . str_replace ([ '<' , '>' ],[ '.' , '.' ], $name );
$r = q ( " SELECT id FROM groups WHERE hash = '%s' LIMIT 1 " , dbesc ( $hash ));
if ( $r )
$dups = true ;
} while ( $dups == true );
$r = q ( " INSERT INTO groups ( hash, uid, visible, gname )
VALUES ( '%s' , % d , % d , '%s' ) " ,
dbesc ( $hash ),
intval ( $uid ),
intval ( $public ),
dbesc ( $name )
);
$ret = $r ;
}
Libsync :: build_sync_packet ( $uid , null , true );
return $ret ;
}
static function remove ( $uid , $name ) {
$ret = false ;
if ( x ( $uid ) && x ( $name )) {
$r = q ( " SELECT id, hash FROM groups WHERE uid = %d AND gname = '%s' LIMIT 1 " ,
intval ( $uid ),
dbesc ( $name )
);
if ( $r ) {
$group_id = $r [ 0 ][ 'id' ];
$group_hash = $r [ 0 ][ 'hash' ];
}
if ( ! $group_id )
return false ;
// remove group from default posting lists
$r = q ( " SELECT channel_default_group, channel_allow_gid, channel_deny_gid FROM channel WHERE channel_id = %d LIMIT 1 " ,
intval ( $uid )
);
if ( $r ) {
$user_info = $r [ 0 ];
$change = false ;
if ( $user_info [ 'channel_default_group' ] == $group_hash ) {
$user_info [ 'channel_default_group' ] = '' ;
$change = true ;
}
if ( strpos ( $user_info [ 'channel_allow_gid' ], '<' . $group_hash . '>' ) !== false ) {
$user_info [ 'channel_allow_gid' ] = str_replace ( '<' . $group_hash . '>' , '' , $user_info [ 'channel_allow_gid' ]);
$change = true ;
}
if ( strpos ( $user_info [ 'channel_deny_gid' ], '<' . $group_hash . '>' ) !== false ) {
$user_info [ 'channel_deny_gid' ] = str_replace ( '<' . $group_hash . '>' , '' , $user_info [ 'channel_deny_gid' ]);
$change = true ;
}
if ( $change ) {
q ( " UPDATE channel SET channel_default_group = '%s', channel_allow_gid = '%s', channel_deny_gid = '%s'
WHERE channel_id = % d " ,
intval ( $user_info [ 'channel_default_group' ]),
dbesc ( $user_info [ 'channel_allow_gid' ]),
dbesc ( $user_info [ 'channel_deny_gid' ]),
intval ( $uid )
);
}
}
// remove all members
$r = q ( " DELETE FROM group_member WHERE uid = %d AND gid = %d " ,
intval ( $uid ),
intval ( $group_id )
);
// remove group
$r = q ( " UPDATE groups SET deleted = 1 WHERE uid = %d AND gname = '%s' " ,
intval ( $uid ),
dbesc ( $name )
);
$ret = $r ;
}
Libsync :: build_sync_packet ( $uid , null , true );
return $ret ;
}
static function byname ( $uid , $name ) {
if (( ! $uid ) || ( ! strlen ( $name )))
return false ;
$r = q ( " SELECT * FROM groups WHERE uid = %d AND gname = '%s' LIMIT 1 " ,
intval ( $uid ),
dbesc ( $name )
);
if ( $r )
return $r [ 0 ][ 'id' ];
return false ;
}
static function rec_byhash ( $uid , $hash ) {
if (( ! $uid ) || ( ! strlen ( $hash )))
return false ;
$r = q ( " SELECT * FROM groups WHERE uid = %d AND hash = '%s' LIMIT 1 " ,
intval ( $uid ),
dbesc ( $hash )
);
if ( $r )
return $r [ 0 ];
return false ;
}
static function member_remove ( $uid , $name , $member ) {
$gid = self :: byname ( $uid , $name );
if ( ! $gid )
return false ;
if ( ! ( $uid && $gid && $member ))
return false ;
$r = q ( " DELETE FROM group_member WHERE uid = %d AND gid = %d AND xchan = '%s' " ,
intval ( $uid ),
intval ( $gid ),
dbesc ( $member )
);
Libsync :: build_sync_packet ( $uid , null , true );
return $r ;
}
static function member_add ( $uid , $name , $member , $gid = 0 ) {
if ( ! $gid )
$gid = self :: byname ( $uid , $name );
if (( ! $gid ) || ( ! $uid ) || ( ! $member ))
return false ;
$r = q ( " SELECT * FROM group_member WHERE uid = %d AND gid = %d AND xchan = '%s' LIMIT 1 " ,
intval ( $uid ),
intval ( $gid ),
dbesc ( $member )
);
if ( $r )
return true ; // You might question this, but
// we indicate success because the group member was in fact created
// -- It was just created at another time
if ( ! $r )
$r = q ( " INSERT INTO group_member (uid, gid, xchan)
VALUES ( % d , % d , '%s' ) " ,
intval ( $uid ),
intval ( $gid ),
dbesc ( $member )
);
Libsync :: build_sync_packet ( $uid , null , true );
return $r ;
}
static function members ( $gid ) {
$ret = array ();
if ( intval ( $gid )) {
$r = q ( " SELECT * FROM group_member
LEFT JOIN abook ON abook_xchan = group_member . xchan left join xchan on xchan_hash = abook_xchan
WHERE gid = % d AND abook_channel = % d and group_member . uid = % d and xchan_deleted = 0 and abook_self = 0 and abook_blocked = 0 and abook_pending = 0 ORDER BY xchan_name ASC " ,
intval ( $gid ),
intval ( local_channel ()),
intval ( local_channel ())
);
if ( $r )
$ret = $r ;
}
return $ret ;
}
static function members_xchan ( $gid ) {
$ret = [];
if ( intval ( $gid )) {
$r = q ( " SELECT xchan FROM group_member WHERE gid = %d AND uid = %d " ,
intval ( $gid ),
intval ( local_channel ())
);
if ( $r ) {
foreach ( $r as $rr ) {
$ret [] = $rr [ 'xchan' ];
}
}
}
return $ret ;
}
static function members_profile_xchan ( $uid , $gid ) {
$ret = [];
if ( intval ( $gid )) {
$r = q ( " SELECT abook_xchan as xchan from abook left join profile on abook_profile = profile_guid where profile.id = %d and profile.uid = %d " ,
intval ( $gid ),
intval ( $uid )
);
if ( $r ) {
foreach ( $r as $rr ) {
$ret [] = $rr [ 'xchan' ];
}
}
}
return $ret ;
}
static function select ( $uid , $group = '' ) {
$grps = [];
$o = '' ;
$r = q ( " SELECT * FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC " ,
intval ( $uid )
);
$grps [] = array ( 'name' => '' , 'hash' => '0' , 'selected' => '' );
if ( $r ) {
foreach ( $r as $rr ) {
$grps [] = array ( 'name' => $rr [ 'gname' ], 'id' => $rr [ 'hash' ], 'selected' => (( $group == $rr [ 'hash' ]) ? 'true' : '' ));
}
}
logger ( 'select: ' . print_r ( $grps , true ), LOGGER_DATA );
$o = replace_macros ( get_markup_template ( 'group_selection.tpl' ), array (
'$label' => t ( 'Add new connections to this privacy group' ),
'$groups' => $grps
));
return $o ;
}
static function widget ( $every = " connections " , $each = " group " , $edit = false , $group_id = 0 , $cid = '' , $mode = 1 ) {
$o = '' ;
2018-09-14 04:25:37 +00:00
$groups = [];
2018-07-03 23:40:54 +00:00
$r = q ( " SELECT * FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC " ,
intval ( $_SESSION [ 'uid' ])
);
2018-09-14 04:25:37 +00:00
$member_of = [];
2018-07-03 23:40:54 +00:00
if ( $cid ) {
$member_of = self :: containing ( local_channel (), $cid );
}
if ( $r ) {
foreach ( $r as $rr ) {
$selected = (( $group_id == $rr [ 'id' ]) ? ' group-selected' : '' );
if ( $edit ) {
$groupedit = [ 'href' => " group/ " . $rr [ 'id' ], 'title' => t ( 'edit' ) ];
}
else {
$groupedit = null ;
}
$groups [] = [
'id' => $rr [ 'id' ],
'enc_cid' => base64url_encode ( $cid ),
'cid' => $cid ,
'text' => $rr [ 'gname' ],
'selected' => $selected ,
'href' => (( $mode == 0 ) ? $each . '?f=&gid=' . $rr [ 'id' ] : $each . " / " . $rr [ 'id' ]) . (( x ( $_GET , 'new' )) ? '&new=' . $_GET [ 'new' ] : '' ) . (( x ( $_GET , 'order' )) ? '&order=' . $_GET [ 'order' ] : '' ),
'edit' => $groupedit ,
'ismember' => in_array ( $rr [ 'id' ], $member_of ),
];
}
}
$tpl = get_markup_template ( " group_side.tpl " );
$o = replace_macros ( $tpl , array (
'$title' => t ( 'Privacy Groups' ),
'$edittext' => t ( 'Edit group' ),
'$createtext' => t ( 'Add privacy group' ),
'$ungrouped' => (( $every === 'contacts' ) ? t ( 'Channels not in any privacy group' ) : '' ),
'$groups' => $groups ,
'$add' => t ( 'add' ),
));
return $o ;
}
static function expand ( $g ) {
if ( ! ( is_array ( $g ) && count ( $g )))
return array ();
$ret = [];
$x = [];
// private profile linked virtual groups
foreach ( $g as $gv ) {
if ( substr ( $gv , 0 , 3 ) === 'vp.' ) {
$profile_hash = substr ( $gv , 3 );
if ( $profile_hash ) {
$r = q ( " select abook_xchan from abook where abook_profile = '%s' " ,
dbesc ( $profile_hash )
);
if ( $r ) {
foreach ( $r as $rv ) {
$ret [] = $rv [ 'abook_xchan' ];
}
}
}
}
else {
$x [] = $gv ;
}
}
if ( $x ) {
stringify_array_elms ( $x , true );
$groups = implode ( ',' , $x );
if ( $groups ) {
$r = q ( " SELECT xchan FROM group_member WHERE gid IN ( select id from groups where hash in ( $groups )) " );
if ( $r ) {
foreach ( $r as $rr ) {
$ret [] = $rr [ 'xchan' ];
}
}
}
}
return $ret ;
}
static function member_of ( $c ) {
$r = q ( " SELECT groups.gname, 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.gname ASC " ,
dbesc ( $c )
);
return $r ;
}
static function containing ( $uid , $c ) {
$r = q ( " SELECT gid FROM group_member WHERE uid = %d AND group_member.xchan = '%s' " ,
intval ( $uid ),
dbesc ( $c )
);
$ret = array ();
if ( $r ) {
foreach ( $r as $rr )
$ret [] = $rr [ 'gid' ];
}
return $ret ;
}
}