2012-05-18 10:12:02 +02:00
< ? php
/**
* Name : public_server
2020-02-23 06:13:30 +01:00
* Description : Friendica addon with functions suitable for a public server . WARNING : This addon is currently not well maintained . It may produce unexpected results . Use with caution !
2013-12-20 18:58:50 +01:00
* Version : 1.1
2012-05-18 10:12:02 +02:00
* Author : Keith Fernie < http :// friendika . me4 . it / profile / keith >
*/
2018-01-25 03:29:09 +01:00
2018-10-17 21:34:15 +02:00
use Friendica\BaseModule ;
2018-12-26 08:28:16 +01:00
use Friendica\Core\Hook ;
2018-10-30 00:40:18 +01:00
use Friendica\Core\Logger ;
2018-10-31 15:55:15 +01:00
use Friendica\Core\Renderer ;
2018-07-20 14:20:48 +02:00
use Friendica\Database\DBA ;
2019-12-30 03:55:10 +01:00
use Friendica\DI ;
2021-01-23 21:36:36 +01:00
use Friendica\Model\Notification ;
2021-10-07 07:53:16 +02:00
use Friendica\Model\User ;
2023-01-01 20:21:56 +01:00
use Friendica\Core\Config\Util\ConfigFileManager ;
2018-01-27 03:39:02 +01:00
use Friendica\Util\DateTimeFormat ;
2012-05-18 10:12:02 +02:00
2018-02-19 06:19:02 +01:00
function public_server_install ()
{
2018-12-26 08:28:16 +01:00
Hook :: register ( 'load_config' , 'addon/public_server/public_server.php' , 'public_server_load_config' );
Hook :: register ( 'register_account' , 'addon/public_server/public_server.php' , 'public_server_register_account' );
Hook :: register ( 'cron' , 'addon/public_server/public_server.php' , 'public_server_cron' );
Hook :: register ( 'enotify' , 'addon/public_server/public_server.php' , 'public_server_enotify' );
Hook :: register ( 'logged_in' , 'addon/public_server/public_server.php' , 'public_server_login' );
2012-05-18 10:12:02 +02:00
}
2023-01-14 03:16:09 +01:00
function public_server_load_config ( ConfigFileManager $loader )
2018-06-28 05:18:46 +02:00
{
2024-12-11 22:47:10 +01:00
DI :: appHelper () -> getConfigCache () -> load ( $loader -> loadAddonConfig ( 'public_server' ), \Friendica\Core\Config\ValueObject\Cache :: SOURCE_STATIC );
2018-06-28 05:18:46 +02:00
}
2023-01-14 03:16:09 +01:00
function public_server_register_account ( $b )
2018-02-19 06:19:02 +01:00
{
2012-05-18 10:12:02 +02:00
$uid = $b ;
2020-01-19 21:21:12 +01:00
$days = DI :: config () -> get ( 'public_server' , 'expiredays' );
$days_posts = DI :: config () -> get ( 'public_server' , 'expireposts' );
2018-02-18 23:20:38 +01:00
if ( ! $days ) {
2012-05-18 10:12:02 +02:00
return ;
2018-02-18 23:20:38 +01:00
}
2012-05-18 10:12:02 +02:00
2018-02-18 23:20:38 +01:00
$fields = [ 'account_expires_on' => DateTimeFormat :: utc ( 'now +' . $days . ' days' ), 'expire' => $days_posts ];
2018-07-20 14:20:48 +02:00
DBA :: update ( 'user' , $fields , [ 'uid' => $uid ]);
2018-02-18 23:20:38 +01:00
}
2012-05-18 10:12:02 +02:00
2023-01-14 03:16:09 +01:00
function public_server_cron ( $b )
2018-02-19 06:19:02 +01:00
{
2021-10-21 08:04:27 +02:00
Logger :: notice ( " public_server: cron start " );
2013-07-19 23:34:54 +02:00
2021-12-03 13:35:02 +01:00
$users = DBA :: selectToArray ( 'user' , [], [ " `account_expires_on` > ? AND `account_expires_on` < ?
AND `expire_notification_sent` <= ? " , DBA::NULL_DATETIME, DateTimeFormat::utc('now + 5 days'), DBA::NULL_DATETIME]);
2021-10-07 07:53:16 +02:00
foreach ( $users as $rr ) {
2021-10-19 21:53:10 +02:00
DI :: notify () -> createFromArray ([
2021-10-07 07:53:16 +02:00
'type' => Notification\Type :: SYSTEM ,
2023-01-09 15:22:30 +01:00
'event' => 'SYSTEM_PUBLIC_SERVER_EXPIRATION' ,
2021-10-07 07:53:16 +02:00
'uid' => $rr [ 'uid' ],
'system_type' => 'public_server_expire' ,
'source_name' => DI :: l10n () -> t ( 'Administrator' ),
2023-02-18 20:57:09 +01:00
'source_link' => DI :: baseUrl (),
'source_photo' => DI :: baseUrl () . '/images/person-80.jpg' ,
2021-10-07 07:53:16 +02:00
]);
2012-05-18 10:12:02 +02:00
2021-10-07 07:53:16 +02:00
$fields = [ 'expire_notification_sent' => DateTimeFormat :: utcNow ()];
DBA :: update ( 'user' , $fields , [ 'uid' => $rr [ 'uid' ]]);
2012-05-18 10:12:02 +02:00
}
2020-01-19 21:21:12 +01:00
$nologin = DI :: config () -> get ( 'public_server' , 'nologin' , false );
2018-02-18 23:20:38 +01:00
if ( $nologin ) {
2021-12-03 13:35:02 +01:00
$users = DBA :: selectToArray ( 'user' , [], [ " NOT `account_expired` AND `login_date` <= ? AND `register_date` < ? AND `account_expires_on` <= ? " ,
DBA :: NULL_DATETIME , DateTimeFormat :: utc ( 'now - ' . ( int ) $nologin . ' days' ), DBA :: NULL_DATETIME ]);
2021-10-07 07:53:16 +02:00
foreach ( $users as $rr ) {
$fields = [ 'account_expires_on' => DateTimeFormat :: utc ( 'now +6 days' )];
DBA :: update ( 'user' , $fields , [ 'uid' => $rr [ 'uid' ]]);
2017-11-19 23:09:54 +01:00
}
2012-05-18 10:12:02 +02:00
}
2018-02-18 23:20:38 +01:00
2020-01-19 21:21:12 +01:00
$flagusers = DI :: config () -> get ( 'public_server' , 'flagusers' , false );
2018-02-18 23:20:38 +01:00
if ( $flagusers ) {
2021-12-03 13:35:02 +01:00
$users = DBA :: selectToArray ( 'user' , [], [ " NOT `account_expired` AND `login_date` < ? AND `account_expires_on` <= ? AND `page-flags` = ? " ,
DateTimeFormat :: utc ( 'now - ' . ( int ) $flagusers . ' days' ), DBA :: NULL_DATETIME , User :: PAGE_FLAGS_NORMAL ]);
2021-10-07 07:53:16 +02:00
foreach ( $users as $rr ) {
$fields = [ 'account_expires_on' => DateTimeFormat :: utc ( 'now +6 days' )];
DBA :: update ( 'user' , $fields , [ 'uid' => $rr [ 'uid' ]]);
2012-05-18 10:12:02 +02:00
}
2018-02-18 23:20:38 +01:00
}
2012-05-18 10:12:02 +02:00
2020-01-19 21:21:12 +01:00
$flagposts = DI :: config () -> get ( 'public_server' , 'flagposts' );
$flagpostsexpire = DI :: config () -> get ( 'public_server' , 'flagpostsexpire' );
2012-05-18 10:12:02 +02:00
if ( $flagposts && $flagpostsexpire ) {
2021-12-03 13:35:02 +01:00
$users = DBA :: selectToArray ( 'user' , [], [ " NOT `account_expired` AND `login_date` < ? AND `account_expires_on` <= ? AND NOT `expire` AND `page-flags` = ? " ,
DateTimeFormat :: utc ( 'now - ' . ( int ) $flagposts . ' days' ), DBA :: NULL_DATETIME , User :: PAGE_FLAGS_NORMAL ]);
2021-10-07 07:53:16 +02:00
foreach ( $users as $rr ) {
DBA :: update ( 'user' , [ 'expire' => $flagpostsexpire ], [ 'uid' => $rr [ 'uid' ]]);
2012-05-18 10:12:02 +02:00
}
2018-02-18 23:20:38 +01:00
}
2012-05-18 10:12:02 +02:00
2021-10-21 08:04:27 +02:00
Logger :: notice ( " public_server: cron end " );
2012-05-18 10:12:02 +02:00
}
2023-01-14 03:16:09 +01:00
function public_server_enotify ( array & $b )
2018-02-19 06:19:02 +01:00
{
2021-02-03 23:29:09 +01:00
if ( ! empty ( $b [ 'params' ]) && $b [ 'params' ][ 'type' ] == Notification\Type :: SYSTEM
2018-11-30 15:11:56 +01:00
&& ! empty ( $b [ 'params' ][ 'system_type' ]) && $b [ 'params' ][ 'system_type' ] === 'public_server_expire' ) {
2023-02-18 20:57:09 +01:00
$b [ 'itemlink' ] = DI :: baseUrl ();
2020-01-19 21:21:12 +01:00
$b [ 'epreamble' ] = $b [ 'preamble' ] = DI :: l10n () -> t ( 'Your account on %s will expire in a few days.' , DI :: config () -> get ( 'system' , 'sitename' ));
2020-01-18 20:52:33 +01:00
$b [ 'subject' ] = DI :: l10n () -> t ( 'Your Friendica account is about to expire.' );
2020-01-19 21:21:12 +01:00
$b [ 'body' ] = DI :: l10n () -> t ( " Hi %1 \$ s, \n \n Your account on %2 \$ s will expire in less than five days. You may keep your account by logging in at least once every 30 days " , $b [ 'params' ][ 'to_name' ], " [url= " . DI :: config () -> get ( 'system' , 'url' ) . " ] " . DI :: config () -> get ( 'config' , 'sitename' ) . " [/url] " );
2018-02-18 23:20:38 +01:00
}
2012-05-18 10:12:02 +02:00
}
2023-01-14 03:16:09 +01:00
function public_server_login ( $b )
2018-02-19 06:19:02 +01:00
{
2020-01-19 21:21:12 +01:00
$days = DI :: config () -> get ( 'public_server' , 'expiredays' );
2018-02-18 23:20:38 +01:00
if ( ! $days ) {
2012-05-18 10:12:02 +02:00
return ;
2018-02-18 23:20:38 +01:00
}
$fields = [ 'account_expires_on' => DateTimeFormat :: utc ( 'now +' . $days . ' days' )];
2022-10-20 23:51:49 +02:00
$condition = [ " `uid` = ? AND `account_expires_on` > ? " , DI :: userSession () -> getLocalUserId (), DBA :: NULL_DATETIME ];
2018-07-20 14:20:48 +02:00
DBA :: update ( 'user' , $fields , $condition );
2012-05-18 10:12:02 +02:00
}
2013-12-20 18:58:50 +01:00
2023-01-14 03:16:09 +01:00
function public_server_addon_admin_post ()
2018-02-19 06:19:02 +01:00
{
2018-10-17 21:34:15 +02:00
BaseModule :: checkFormSecurityTokenRedirectOnError ( '/admin/addons/publicserver' , 'publicserver' );
2022-06-30 13:32:13 +02:00
DI :: config () -> set ( 'public_server' , 'expiredays' , trim ( $_POST [ 'expiredays' ] ? ? '' ));
DI :: config () -> set ( 'public_server' , 'expireposts' , trim ( $_POST [ 'expireposts' ] ? ? '' ));
DI :: config () -> set ( 'public_server' , 'nologin' , trim ( $_POST [ 'nologin' ] ? ? '' ));
DI :: config () -> set ( 'public_server' , 'flagusers' , trim ( $_POST [ 'flagusers' ] ? ? '' ));
DI :: config () -> set ( 'public_server' , 'flagposts' , trim ( $_POST [ 'flagposts' ] ? ? '' ));
DI :: config () -> set ( 'public_server' , 'flagpostsexpire' , trim ( $_POST [ 'flagpostsexpire' ] ? ? '' ));
2013-12-20 18:58:50 +01:00
}
2018-02-18 23:20:38 +01:00
2023-01-14 03:16:09 +01:00
function public_server_addon_admin ( string & $o )
2018-02-19 06:19:02 +01:00
{
2022-06-30 13:32:13 +02:00
$token = BaseModule :: getFormSecurityToken ( 'publicserver' );
$t = Renderer :: getMarkupTemplate ( 'admin.tpl' , 'addon/public_server' );
2018-10-31 15:55:15 +01:00
$o = Renderer :: replaceMacros ( $t , [
2020-01-18 20:52:33 +01:00
'$submit' => DI :: l10n () -> t ( 'Save Settings' ),
2018-02-18 23:20:38 +01:00
'$form_security_token' => $token ,
2020-01-18 20:52:33 +01:00
'$infotext' => DI :: l10n () -> t ( 'Set any of these options to 0 to deactivate it.' ),
2022-06-30 13:32:13 +02:00
'$expiredays' => [ " expiredays " , " Expire Days " , intval ( DI :: config () -> get ( 'public_server' , 'expiredays' )), " When an account is created on the site, it is given a hard " ],
2020-01-19 21:21:12 +01:00
'$expireposts' => [ " expireposts " , " Expire Posts " , intval ( DI :: config () -> get ( 'public_server' , 'expireposts' )), " Set the default days for posts to expire here " ],
'$nologin' => [ " nologin " , " No Login " , intval ( DI :: config () -> get ( 'public_server' , 'nologin' )), " Remove users who have never logged in after nologin days " ],
'$flagusers' => [ " flagusers " , " Flag users " , intval ( DI :: config () -> get ( 'public_server' , 'flagusers' )), " Remove users who last logged in over flagusers days ago " ],
'$flagposts' => [ " flagposts " , " Flag posts " , intval ( DI :: config () -> get ( 'public_server' , 'flagposts' )), " For users who last logged in over flagposts days ago set post expiry days to flagpostsexpire " ],
'$flagpostsexpire' => [ " flagpostsexpire " , " Flag posts expire " , intval ( DI :: config () -> get ( 'public_server' , 'flagpostsexpire' ))],
2018-02-18 23:20:38 +01:00
]);
2013-12-20 18:58:50 +01:00
}