2019-05-04 14:32:31 -04:00
< ? php
2020-02-09 09:45:36 -05:00
/**
2022-01-02 02:27:47 -05:00
* @ copyright Copyright ( C ) 2010 - 2022 , the Friendica project
2020-02-09 09:45:36 -05:00
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
*/
2019-05-04 14:32:31 -04:00
namespace Friendica\Module ;
use Friendica\BaseModule ;
use Friendica\Core\Renderer ;
2022-04-26 14:33:58 -04:00
use Friendica\Core\Search ;
2019-12-15 16:34:11 -05:00
use Friendica\DI ;
2019-05-04 14:32:31 -04:00
use Friendica\Model ;
2021-08-08 15:30:21 -04:00
use Friendica\Model\User ;
2019-05-04 14:32:31 -04:00
use Friendica\Network\HTTPException ;
use Friendica\Protocol\Email ;
use Friendica\Util\Strings ;
/**
* Invite people to friendica
*/
class Invite extends BaseModule
{
2021-11-28 07:44:42 -05:00
protected function post ( array $request = [])
2019-05-04 14:32:31 -04:00
{
2022-10-20 16:59:12 -04:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2020-01-18 14:52:34 -05:00
throw new HTTPException\ForbiddenException ( DI :: l10n () -> t ( 'Permission denied.' ));
2019-05-04 14:32:31 -04:00
}
self :: checkFormSecurityTokenRedirectOnError ( '/' , 'send_invite' );
2019-12-15 16:34:11 -05:00
$app = DI :: app ();
2019-12-15 17:44:33 -05:00
$config = DI :: config ();
2019-05-04 14:32:31 -04:00
$max_invites = intval ( $config -> get ( 'system' , 'max_invites' ));
if ( ! $max_invites ) {
$max_invites = 50 ;
}
2022-10-20 16:59:12 -04:00
$current_invites = intval ( DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'system' , 'sent_invites' ));
2019-05-04 14:32:31 -04:00
if ( $current_invites > $max_invites ) {
2020-01-18 14:52:34 -05:00
throw new HTTPException\ForbiddenException ( DI :: l10n () -> t ( 'Total invitation limit exceeded.' ));
2019-05-04 14:32:31 -04:00
}
2019-05-04 15:25:16 -04:00
$recipients = ! empty ( $_POST [ 'recipients' ]) ? explode ( " \n " , $_POST [ 'recipients' ]) : [];
2021-11-07 04:18:25 -05:00
$message = ! empty ( $_POST [ 'message' ]) ? Strings :: escapeHtml ( trim ( $_POST [ 'message' ])) : '' ;
2019-05-04 14:32:31 -04:00
$total = 0 ;
$invitation_only = false ;
$invites_remaining = null ;
if ( $config -> get ( 'system' , 'invitation_only' )) {
$invitation_only = true ;
2022-10-20 16:59:12 -04:00
$invites_remaining = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'system' , 'invites_remaining' );
2021-11-04 16:29:59 -04:00
if (( ! $invites_remaining ) && ( ! $app -> isSiteAdmin ())) {
2019-05-04 14:32:31 -04:00
throw new HTTPException\ForbiddenException ();
}
}
2022-10-20 16:59:12 -04:00
$user = User :: getById ( DI :: userSession () -> getLocalUserId ());
2021-08-08 15:30:21 -04:00
2019-05-04 14:32:31 -04:00
foreach ( $recipients as $recipient ) {
$recipient = trim ( $recipient );
if ( ! filter_var ( $recipient , FILTER_VALIDATE_EMAIL )) {
2022-10-17 14:55:22 -04:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( '%s : Not a valid email address.' , $recipient ));
2019-05-04 14:32:31 -04:00
continue ;
}
2021-11-04 16:29:59 -04:00
if ( $invitation_only && ( $invites_remaining || $app -> isSiteAdmin ())) {
2019-05-04 14:32:31 -04:00
$code = Model\Register :: createForInvitation ();
$nmessage = str_replace ( '$invite_code' , $code , $message );
2021-11-04 16:29:59 -04:00
if ( ! $app -> isSiteAdmin ()) {
2019-05-04 14:32:31 -04:00
$invites_remaining -- ;
if ( $invites_remaining >= 0 ) {
2022-10-20 16:59:12 -04:00
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'system' , 'invites_remaining' , $invites_remaining );
2019-05-04 14:32:31 -04:00
} else {
return ;
}
}
} else {
$nmessage = $message ;
}
2021-08-08 15:30:21 -04:00
$additional_headers = 'From: "' . $user [ 'email' ] . '" <' . DI :: emailer () -> getSiteEmailAddress () . " > \n "
2019-05-04 14:32:31 -04:00
. 'Content-type: text/plain; charset=UTF-8' . " \n "
. 'Content-transfer-encoding: 8bit' ;
$res = mail (
$recipient ,
2020-01-18 14:52:34 -05:00
Email :: encodeHeader ( DI :: l10n () -> t ( 'Please join us on Friendica' ), 'UTF-8' ),
2019-05-04 14:32:31 -04:00
$nmessage ,
$additional_headers );
if ( $res ) {
$total ++ ;
$current_invites ++ ;
2022-10-20 16:59:12 -04:00
DI :: pConfig () -> set ( DI :: userSession () -> getLocalUserId (), 'system' , 'sent_invites' , $current_invites );
2019-05-04 14:32:31 -04:00
if ( $current_invites > $max_invites ) {
2022-10-17 14:55:22 -04:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( 'Invitation limit exceeded. Please contact your site administrator.' ));
2019-05-04 14:32:31 -04:00
return ;
}
} else {
2022-10-17 14:55:22 -04:00
DI :: sysmsg () -> addNotice ( DI :: l10n () -> t ( '%s : Message delivery failed.' , $recipient ));
2019-05-04 14:32:31 -04:00
}
}
2022-10-17 14:55:22 -04:00
DI :: sysmsg () -> addInfo ( DI :: l10n () -> tt ( '%d message sent.' , '%d messages sent.' , $total ));
2019-05-04 14:32:31 -04:00
}
2021-11-20 09:38:03 -05:00
protected function content ( array $request = []) : string
2019-05-04 14:32:31 -04:00
{
2022-10-20 16:59:12 -04:00
if ( ! DI :: userSession () -> getLocalUserId ()) {
2020-01-18 14:52:34 -05:00
throw new HTTPException\ForbiddenException ( DI :: l10n () -> t ( 'Permission denied.' ));
2019-05-04 14:32:31 -04:00
}
2019-12-15 16:34:11 -05:00
$app = DI :: app ();
2019-12-15 17:44:33 -05:00
$config = DI :: config ();
2019-05-04 14:32:31 -04:00
$inviteOnly = false ;
if ( $config -> get ( 'system' , 'invitation_only' )) {
$inviteOnly = true ;
2022-10-20 16:59:12 -04:00
$x = DI :: pConfig () -> get ( DI :: userSession () -> getLocalUserId (), 'system' , 'invites_remaining' );
2021-11-04 16:29:59 -04:00
if (( ! $x ) && ( ! $app -> isSiteAdmin ())) {
2020-01-18 14:52:34 -05:00
throw new HTTPException\ForbiddenException ( DI :: l10n () -> t ( 'You have no more invitations available' ));
2019-05-04 14:32:31 -04:00
}
}
2022-04-26 14:33:58 -04:00
$dirLocation = Search :: getGlobalDirectory ();
2019-05-04 14:32:31 -04:00
if ( strlen ( $dirLocation )) {
if ( $config -> get ( 'config' , 'register_policy' ) === Register :: CLOSED ) {
2020-01-18 14:52:34 -05:00
$linkTxt = DI :: l10n () -> t ( 'Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks.' , $dirLocation . '/servers' );
2019-05-04 14:32:31 -04:00
} else {
2020-01-18 14:52:34 -05:00
$linkTxt = DI :: l10n () -> t ( 'To accept this invitation, please visit and register at %s or any other public Friendica website.' , DI :: baseUrl () -> get ())
. " \r \n " . " \r \n " . DI :: l10n () -> t ( 'Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join.' , $dirLocation . '/servers' );
2019-05-04 14:32:31 -04:00
}
} else { // there is no global directory URL defined
if ( $config -> get ( 'config' , 'register_policy' ) === Register :: CLOSED ) {
2020-01-18 14:52:34 -05:00
return DI :: l10n () -> t ( 'Our apologies. This system is not currently configured to connect with other public sites or invite members.' );
2019-05-04 14:32:31 -04:00
} else {
2020-01-18 14:52:34 -05:00
$linkTxt = DI :: l10n () -> t ( 'To accept this invitation, please visit and register at %s.' , DI :: baseUrl () -> get ()
. " \r \n " . " \r \n " . DI :: l10n () -> t ( 'Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks.' ));
2019-05-04 14:32:31 -04:00
}
}
$tpl = Renderer :: getMarkupTemplate ( 'invite.tpl' );
return Renderer :: replaceMacros ( $tpl , [
2019-05-04 15:25:16 -04:00
'$form_security_token' => self :: getFormSecurityToken ( 'send_invite' ),
2020-01-18 14:52:34 -05:00
'$title' => DI :: l10n () -> t ( 'Send invitations' ),
'$recipients' => [ 'recipients' , DI :: l10n () -> t ( 'Enter email addresses, one per line:' )],
2019-05-04 14:32:31 -04:00
'$message' => [
'message' ,
2020-01-18 14:52:34 -05:00
DI :: l10n () -> t ( 'Your message:' ),
DI :: l10n () -> t ( 'You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web.' ) . " \r \n " . " \r \n "
2019-05-04 14:32:31 -04:00
. $linkTxt
2020-01-18 14:52:34 -05:00
. " \r \n " . " \r \n " . (( $inviteOnly ) ? DI :: l10n () -> t ( 'You will need to supply this invitation code: $invite_code' ) . " \r \n " . " \r \n " : '' ) . DI :: l10n () -> t ( 'Once you have registered, please connect with me via my profile page at:' )
2021-08-09 15:48:39 -04:00
. " \r \n " . " \r \n " . DI :: baseUrl () -> get () . '/profile/' . $app -> getLoggedInUserNickname ()
2020-01-18 14:52:34 -05:00
. " \r \n " . " \r \n " . DI :: l10n () -> t ( 'For more information about the Friendica project and why we feel it is important, please visit http://friendi.ca' ) . " \r \n " . " \r \n " ,
2019-05-04 14:32:31 -04:00
],
2020-01-18 14:52:34 -05:00
'$submit' => DI :: l10n () -> t ( 'Submit' )
2019-05-04 14:32:31 -04:00
]);
}
}