2016-04-19 03:38:38 +00:00
< ? php
namespace Zotlabs\Module ;
2018-06-05 01:40:11 +00:00
use Zotlabs\Lib\Libsync ;
2018-07-03 23:40:54 +00:00
use Zotlabs\Lib\Group as ZGroup ;
2016-04-19 03:38:38 +00:00
class Group extends \Zotlabs\Web\Controller {
2018-06-17 14:58:12 +00:00
function init () {
if ( ! local_channel ()) {
notice ( t ( 'Permission denied.' ) . EOL );
return ;
}
\App :: $profile_uid = local_channel ();
nav_set_selected ( 'Privacy Groups' );
}
2016-04-19 03:38:38 +00:00
function post () {
if ( ! local_channel ()) {
notice ( t ( 'Permission denied.' ) . EOL );
return ;
}
if (( argc () == 2 ) && ( argv ( 1 ) === 'new' )) {
check_form_security_token_redirectOnErr ( '/group/new' , 'group_edit' );
$name = notags ( trim ( $_POST [ 'groupname' ]));
$public = intval ( $_POST [ 'public' ]);
2018-07-03 23:40:54 +00:00
$r = ZGroup :: add ( local_channel (), $name , $public );
2016-04-19 03:38:38 +00:00
if ( $r ) {
info ( t ( 'Privacy group created.' ) . EOL );
}
2018-06-17 14:58:12 +00:00
else {
notice ( t ( 'Could not create privacy group.' ) . EOL );
}
2016-04-19 03:38:38 +00:00
goaway ( z_root () . '/group' );
}
if (( argc () == 2 ) && ( intval ( argv ( 1 )))) {
check_form_security_token_redirectOnErr ( '/group' , 'group_edit' );
2016-10-04 05:01:14 +00:00
$r = q ( " SELECT * FROM groups WHERE id = %d AND uid = %d LIMIT 1 " ,
2016-04-19 03:38:38 +00:00
intval ( argv ( 1 )),
intval ( local_channel ())
);
if ( ! $r ) {
notice ( t ( 'Privacy group not found.' ) . EOL );
goaway ( z_root () . '/connections' );
}
$group = $r [ 0 ];
$groupname = notags ( trim ( $_POST [ 'groupname' ]));
$public = intval ( $_POST [ 'public' ]);
2016-06-01 04:45:33 +00:00
if (( strlen ( $groupname )) && (( $groupname != $group [ 'gname' ]) || ( $public != $group [ 'visible' ]))) {
2016-10-04 05:01:14 +00:00
$r = q ( " UPDATE groups SET gname = '%s', visible = %d WHERE uid = %d AND id = %d " ,
2016-04-19 03:38:38 +00:00
dbesc ( $groupname ),
intval ( $public ),
intval ( local_channel ()),
intval ( $group [ 'id' ])
);
if ( $r )
info ( t ( 'Privacy group updated.' ) . EOL );
2018-06-05 01:40:11 +00:00
Libsync :: build_sync_packet ( local_channel (), null , true );
2016-04-19 03:38:38 +00:00
}
goaway ( z_root () . '/group/' . argv ( 1 ) . '/' . argv ( 2 ));
}
return ;
}
2017-07-20 01:32:16 +00:00
function get () {
2016-04-19 03:38:38 +00:00
$change = false ;
logger ( 'mod_group: ' . \App :: $cmd , LOGGER_DEBUG );
if ( ! local_channel ()) {
notice ( t ( 'Permission denied' ) . EOL );
return ;
}
2018-06-17 14:58:12 +00:00
2016-04-19 03:38:38 +00:00
// Switch to text mode interface if we have more than 'n' contacts or group members
$switchtotext = get_pconfig ( local_channel (), 'system' , 'groupedit_image_limit' );
if ( $switchtotext === false )
$switchtotext = get_config ( 'system' , 'groupedit_image_limit' );
if ( $switchtotext === false )
$switchtotext = 400 ;
2018-06-17 14:58:12 +00:00
if (( argc () == 1 ) || (( argc () == 2 ) && ( argv ( 1 ) === 'new' ))) {
$new = ((( argc () == 2 ) && ( argv ( 1 ) === 'new' )) ? true : false );
$groups = q ( " SELECT id, gname FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC " ,
intval ( local_channel ())
);
$i = 0 ;
foreach ( $groups as $group ) {
$entries [ $i ][ 'name' ] = $group [ 'gname' ];
$entries [ $i ][ 'id' ] = $group [ 'id' ];
2018-07-03 23:40:54 +00:00
$entries [ $i ][ 'count' ] = count ( Zgroup :: members ( $group [ 'id' ]));
2018-06-17 14:58:12 +00:00
$i ++ ;
}
$tpl = get_markup_template ( 'privacy_groups.tpl' );
$o = replace_macros ( $tpl , [
'$title' => t ( 'Privacy Groups' ),
'$add_new_label' => t ( 'Add Group' ),
'$new' => $new ,
// new group form
'$gname' => array ( 'groupname' , t ( 'Privacy group name' )),
'$public' => array ( 'public' , t ( 'Members are visible to other channels' ), false ),
2016-04-19 03:38:38 +00:00
'$form_security_token' => get_form_security_token ( " group_edit " ),
2018-06-17 14:58:12 +00:00
'$submit' => t ( 'Submit' ),
// groups list
'$title' => t ( 'Privacy Groups' ),
'$name_label' => t ( 'Name' ),
'$count_label' => t ( 'Members' ),
'$entries' => $entries
]);
return $o ;
2016-04-19 03:38:38 +00:00
}
2018-06-17 14:58:12 +00:00
$context = array ( '$submit' => t ( 'Submit' ));
$tpl = get_markup_template ( 'group_edit.tpl' );
2016-04-19 03:38:38 +00:00
if (( argc () == 3 ) && ( argv ( 1 ) === 'drop' )) {
check_form_security_token_redirectOnErr ( '/group' , 'group_drop' , 't' );
if ( intval ( argv ( 2 ))) {
2016-10-04 05:01:14 +00:00
$r = q ( " SELECT gname FROM groups WHERE id = %d AND uid = %d LIMIT 1 " ,
2016-04-19 03:38:38 +00:00
intval ( argv ( 2 )),
intval ( local_channel ())
);
if ( $r )
2018-07-03 23:40:54 +00:00
$result = ZGroup :: remove ( local_channel (), $r [ 0 ][ 'gname' ]);
2016-04-19 03:38:38 +00:00
if ( $result )
info ( t ( 'Privacy group removed.' ) . EOL );
else
notice ( t ( 'Unable to remove privacy group.' ) . EOL );
}
goaway ( z_root () . '/group' );
// NOTREACHED
}
if (( argc () > 2 ) && intval ( argv ( 1 )) && argv ( 2 )) {
check_form_security_token_ForbiddenOnErr ( 'group_member_change' , 't' );
$r = q ( " SELECT abook_xchan from abook left join xchan on abook_xchan = xchan_hash where abook_xchan = '%s' and abook_channel = %d and xchan_deleted = 0 and abook_self = 0 and abook_blocked = 0 and abook_pending = 0 limit 1 " ,
dbesc ( base64url_decode ( argv ( 2 ))),
intval ( local_channel ())
);
if ( count ( $r ))
$change = base64url_decode ( argv ( 2 ));
}
if (( argc () > 1 ) && ( intval ( argv ( 1 )))) {
require_once ( 'include/acl_selectors.php' );
2016-10-04 05:01:14 +00:00
$r = q ( " SELECT * FROM groups WHERE id = %d AND uid = %d AND deleted = 0 LIMIT 1 " ,
2016-04-19 03:38:38 +00:00
intval ( argv ( 1 )),
intval ( local_channel ())
);
if ( ! $r ) {
notice ( t ( 'Privacy group not found.' ) . EOL );
goaway ( z_root () . '/connections' );
}
$group = $r [ 0 ];
2018-07-03 23:40:54 +00:00
$members = ZGroup :: members ( $group [ 'id' ]);
2016-04-19 03:38:38 +00:00
$preselected = array ();
if ( count ( $members )) {
foreach ( $members as $member )
if ( ! in_array ( $member [ 'xchan_hash' ], $preselected ))
$preselected [] = $member [ 'xchan_hash' ];
}
if ( $change ) {
if ( in_array ( $change , $preselected )) {
2018-07-03 23:40:54 +00:00
ZGroup :: member_remove ( local_channel (), $group [ 'gname' ], $change );
2016-04-19 03:38:38 +00:00
}
else {
2018-07-03 23:40:54 +00:00
ZGroup :: member_add ( local_channel (), $group [ 'gname' ], $change );
2016-04-19 03:38:38 +00:00
}
2018-07-03 23:40:54 +00:00
$members = ZGroup :: members ( $group [ 'id' ]);
2016-04-19 03:38:38 +00:00
$preselected = array ();
if ( count ( $members )) {
foreach ( $members as $member )
$preselected [] = $member [ 'xchan_hash' ];
}
}
2018-06-17 14:58:12 +00:00
2016-04-19 03:38:38 +00:00
$context = $context + array (
2018-06-17 14:58:12 +00:00
'$title' => sprintf ( t ( 'Privacy Group: %s' ), $group [ 'gname' ]),
'$details_label' => t ( 'Edit' ),
2016-06-01 04:45:33 +00:00
'$gname' => array ( 'groupname' , t ( 'Privacy group name: ' ), $group [ 'gname' ], '' ),
2016-04-19 03:38:38 +00:00
'$gid' => $group [ 'id' ],
'$drop' => $drop_txt ,
'$public' => array ( 'public' , t ( 'Members are visible to other channels' ), $group [ 'visible' ], '' ),
2018-06-17 14:58:12 +00:00
'$form_security_token_edit' => get_form_security_token ( 'group_edit' ),
'$delete' => t ( 'Delete Group' ),
'$form_security_token_drop' => get_form_security_token ( " group_drop " ),
2016-04-19 03:38:38 +00:00
);
}
if ( ! isset ( $group ))
return ;
$groupeditor = array (
2018-06-17 14:58:12 +00:00
'label_members' => t ( 'Group members' ),
2016-04-19 03:38:38 +00:00
'members' => array (),
2018-06-17 14:58:12 +00:00
'label_contacts' => t ( 'Not in this group' ),
2016-04-19 03:38:38 +00:00
'contacts' => array (),
);
$sec_token = addslashes ( get_form_security_token ( 'group_member_change' ));
2018-06-17 14:58:12 +00:00
$textmode = (( $switchtotext && ( count ( $members ) > $switchtotext )) ? true : 'card' );
2016-04-19 03:38:38 +00:00
foreach ( $members as $member ) {
if ( $member [ 'xchan_url' ]) {
$member [ 'archived' ] = ( intval ( $member [ 'abook_archived' ]) ? true : false );
$member [ 'click' ] = 'groupChangeMember(' . $group [ 'id' ] . ',\'' . base64url_encode ( $member [ 'xchan_hash' ]) . '\',\'' . $sec_token . '\'); return false;' ;
$groupeditor [ 'members' ][] = micropro ( $member , true , 'mpgroup' , $textmode );
}
else
2018-07-03 23:40:54 +00:00
ZGroup :: member_remove ( local_channel (), $group [ 'gname' ], $member [ 'xchan_hash' ]);
2016-04-19 03:38:38 +00:00
}
2016-10-04 05:01:14 +00:00
$r = q ( " SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_self = 0 and abook_blocked = 0 and abook_pending = 0 and xchan_deleted = 0 order by xchan_name asc " ,
2016-04-19 03:38:38 +00:00
intval ( local_channel ())
);
if ( count ( $r )) {
2018-06-17 14:58:12 +00:00
$textmode = (( $switchtotext && ( count ( $r ) > $switchtotext )) ? true : 'card' );
2016-04-19 03:38:38 +00:00
foreach ( $r as $member ) {
if ( ! in_array ( $member [ 'xchan_hash' ], $preselected )) {
$member [ 'archived' ] = ( intval ( $member [ 'abook_archived' ]) ? true : false );
$member [ 'click' ] = 'groupChangeMember(' . $group [ 'id' ] . ',\'' . base64url_encode ( $member [ 'xchan_hash' ]) . '\',\'' . $sec_token . '\'); return false;' ;
$groupeditor [ 'contacts' ][] = micropro ( $member , true , 'mpall' , $textmode );
}
}
}
$context [ '$groupeditor' ] = $groupeditor ;
2018-06-17 14:58:12 +00:00
$context [ '$desc' ] = t ( 'Click a channel to toggle membership' );
2016-04-19 03:38:38 +00:00
if ( $change ) {
$tpl = get_markup_template ( 'groupeditor.tpl' );
echo replace_macros ( $tpl , $context );
killme ();
}
return replace_macros ( $tpl , $context );
}
}