2008-08-25 20:29:46 +01:00
< ? php
/*
2009-08-25 23:14:12 +01:00
* StatusNet - the distributed open - source microblogging tool
2011-05-10 01:07:36 +01:00
* Copyright ( C ) 2008 - 2011 , StatusNet , Inc .
2008-08-25 20:29:46 +01:00
*
* 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 < http :// www . gnu . org / licenses />.
*/
2009-08-26 15:41:36 +01:00
if ( ! defined ( 'STATUSNET' ) && ! defined ( 'LACONICA' )) { exit ( 1 ); }
2008-08-25 20:29:46 +01:00
2011-01-31 17:16:55 +00:00
// @todo XXX: Add documentation.
2009-05-24 04:42:19 +01:00
class InviteAction extends CurrentUserDesignAction
2008-12-23 19:49:23 +00:00
{
2009-01-22 22:51:37 +00:00
var $mode = null ;
2009-01-22 22:59:18 +00:00
var $error = null ;
var $already = null ;
var $subbed = null ;
var $sent = null ;
2008-08-27 01:19:27 +01:00
2011-04-18 15:04:57 +01:00
function showNoticeForm ()
{
return ;
}
2009-04-13 20:49:26 +01:00
function isReadOnly ( $args )
2008-12-23 19:33:23 +00:00
{
2008-12-23 19:19:07 +00:00
return false ;
}
2008-08-27 01:19:27 +01:00
2008-12-23 19:33:23 +00:00
function handle ( $args )
{
2008-08-25 20:29:46 +01:00
parent :: handle ( $args );
2009-06-14 09:17:22 +01:00
if ( ! common_config ( 'invite' , 'enabled' )) {
2010-10-19 23:35:39 +01:00
// TRANS: Client error displayed when trying to sent invites while they have been disabled.
2009-06-14 09:17:22 +01:00
$this -> clientError ( _ ( 'Invites have been disabled.' ));
} else if ( ! common_logged_in ()) {
2010-10-19 23:35:39 +01:00
// TRANS: Client error displayed when trying to sent invites while not logged in.
// TRANS: %s is the StatusNet site name.
2010-04-09 23:58:57 +01:00
$this -> clientError ( sprintf ( _ ( 'You must be logged in to invite other users to use %s.' ),
2008-12-23 19:19:07 +00:00
common_config ( 'site' , 'name' )));
return ;
} else if ( $_SERVER [ 'REQUEST_METHOD' ] == 'POST' ) {
2009-01-22 22:51:37 +00:00
$this -> sendInvitations ();
2008-12-23 19:19:07 +00:00
} else {
2009-01-22 22:51:37 +00:00
$this -> showForm ();
2008-12-23 19:19:07 +00:00
}
}
2009-01-22 22:51:37 +00:00
function sendInvitations ()
2008-12-23 19:33:23 +00:00
{
2011-05-10 01:07:36 +01:00
if ( Event :: handle ( 'StartSendInvitations' , array ( & $this ))) {
2008-12-23 19:19:07 +00:00
2011-05-10 01:07:36 +01:00
// CSRF protection
$token = $this -> trimmed ( 'token' );
if ( ! $token || $token != common_session_token ()) {
// TRANS: Client error displayed when the session token does not match or is not given.
$this -> showForm ( _ ( 'There was a problem with your session token. Try again, please.' ));
return ;
}
2008-12-23 19:19:07 +00:00
2011-05-10 01:07:36 +01:00
$user = common_current_user ();
$profile = $user -> getProfile ();
2008-12-23 19:19:07 +00:00
2011-05-10 01:07:36 +01:00
$bestname = $profile -> getBestName ();
$sitename = common_config ( 'site' , 'name' );
$personal = $this -> trimmed ( 'personal' );
2008-12-23 19:19:07 +00:00
2011-05-10 01:07:36 +01:00
$addresses = explode ( " \n " , $this -> trimmed ( 'addresses' ));
foreach ( $addresses as $email ) {
$email = trim ( $email );
$valid = null ;
2011-04-11 21:49:28 +01:00
2011-05-10 01:07:36 +01:00
try {
2011-04-18 18:26:46 +01:00
2011-05-10 01:07:36 +01:00
if ( Event :: handle ( 'StartValidateUserEmail' , array ( null , $email , & $valid ))) {
$valid = Validate :: email ( $email , common_config ( 'email' , 'check_domain' ));
Event :: handle ( 'EndValidateUserEmail' , array ( null , $email , & $valid ));
}
2011-04-18 18:26:46 +01:00
2011-05-10 01:07:36 +01:00
if ( $valid ) {
if ( Event :: handle ( 'StartValidateEmailInvite' , array ( $user , $email , & $valid ))) {
$valid = true ;
Event :: handle ( 'EndValidateEmailInvite' , array ( $user , $email , & $valid ));
}
2011-04-18 18:26:46 +01:00
}
2011-04-11 21:49:28 +01:00
2011-05-10 01:07:36 +01:00
if ( ! $valid ) {
// TRANS: Form validation message when providing an e-mail address that does not validate.
// TRANS: %s is an invalid e-mail address.
$this -> showForm ( sprintf ( _ ( 'Invalid email address: %s.' ), $email ));
return ;
}
} catch ( ClientException $e ) {
$this -> showForm ( $e -> getMessage ());
2011-04-18 18:26:46 +01:00
return ;
}
2008-12-23 19:19:07 +00:00
}
2011-05-10 01:07:36 +01:00
$this -> already = array ();
$this -> subbed = array ();
foreach ( $addresses as $email ) {
$email = common_canonical_email ( $email );
$other = User :: staticGet ( 'email' , $email );
if ( $other ) {
if ( $user -> isSubscribed ( $other )) {
$this -> already [] = $other ;
} else {
subs_subscribe_to ( $user , $other );
$this -> subbed [] = $other ;
}
2008-12-23 19:19:07 +00:00
} else {
2011-05-10 01:07:36 +01:00
$this -> sent [] = $email ;
$this -> sendInvitation ( $email , $user , $personal );
2008-12-23 19:19:07 +00:00
}
}
2011-05-10 01:07:36 +01:00
$this -> mode = 'sent' ;
2009-01-22 22:51:37 +00:00
2011-05-10 01:07:36 +01:00
$this -> showPage ();
Event :: handle ( 'EndSendInvitations' , array ( $this ));
}
2009-01-22 22:51:37 +00:00
}
2009-09-03 20:42:50 +01:00
function showScripts ()
{
parent :: showScripts ();
$this -> autofocus ( 'addresses' );
}
2009-01-22 22:51:37 +00:00
function title ()
{
if ( $this -> mode == 'sent' ) {
2010-10-19 23:35:39 +01:00
// TRANS: Page title when invitations have been sent.
return _ ( 'Invitations sent' );
2009-01-22 22:51:37 +00:00
} else {
2010-10-19 23:35:39 +01:00
// TRANS: Page title when inviting potential users.
2009-01-22 22:51:37 +00:00
return _ ( 'Invite new users' );
}
}
function showContent ()
{
if ( $this -> mode == 'sent' ) {
$this -> showInvitationSuccess ();
} else {
$this -> showInviteForm ();
}
}
function showInvitationSuccess ()
{
2011-05-10 01:07:36 +01:00
if ( Event :: handle ( 'StartShowInvitationSuccess' , array ( $this ))) {
if ( $this -> already ) {
// TRANS: Message displayed inviting users to use a StatusNet site while the inviting user
// TRANS: is already subscribed to one or more users with the given e-mail address(es).
// TRANS: Plural form is based on the number of reported already subscribed e-mail addresses.
// TRANS: Followed by a bullet list.
$this -> element ( 'p' , null , _m ( 'You are already subscribed to this user:' ,
'You are already subscribed to these users:' ,
count ( $this -> already )));
$this -> elementStart ( 'ul' );
foreach ( $this -> already as $other ) {
// TRANS: Used as list item for already subscribed users (%1$s is nickname, %2$s is e-mail address).
$this -> element ( 'li' , null , sprintf ( _m ( 'INVITE' , '%1$s (%2$s)' ), $other -> nickname , $other -> email ));
}
$this -> elementEnd ( 'ul' );
2008-12-23 19:19:07 +00:00
}
2011-05-10 01:07:36 +01:00
if ( $this -> subbed ) {
// TRANS: Message displayed inviting users to use a StatusNet site while the invited user
// TRANS: already uses a this StatusNet site. Plural form is based on the number of
// TRANS: reported already present people. Followed by a bullet list.
$this -> element ( 'p' , null , _m ( 'This person is already a user and you were automatically subscribed:' ,
'These people are already users and you were automatically subscribed to them:' ,
count ( $this -> subbed )));
$this -> elementStart ( 'ul' );
foreach ( $this -> subbed as $other ) {
// TRANS: Used as list item for already registered people (%1$s is nickname, %2$s is e-mail address).
$this -> element ( 'li' , null , sprintf ( _m ( 'INVITE' , '%1$s (%2$s)' ), $other -> nickname , $other -> email ));
}
$this -> elementEnd ( 'ul' );
2008-12-23 19:19:07 +00:00
}
2011-05-10 01:07:36 +01:00
if ( $this -> sent ) {
// TRANS: Message displayed inviting users to use a StatusNet site. Plural form is
// TRANS: based on the number of invitations sent. Followed by a bullet list of
// TRANS: e-mail addresses to which invitations were sent.
$this -> element ( 'p' , null , _m ( 'Invitation sent to the following person:' ,
'Invitations sent to the following people:' ,
count ( $this -> sent )));
$this -> elementStart ( 'ul' );
foreach ( $this -> sent as $other ) {
$this -> element ( 'li' , null , $other );
}
$this -> elementEnd ( 'ul' );
// TRANS: Generic message displayed after sending out one or more invitations to
// TRANS: people to join a StatusNet site.
$this -> element ( 'p' , null , _ ( 'You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!' ));
2008-12-23 19:19:07 +00:00
}
2011-05-10 01:07:36 +01:00
Event :: handle ( 'EndShowInvitationSuccess' , array ( $this ));
2008-12-23 19:19:07 +00:00
}
}
2009-01-22 22:51:37 +00:00
function showPageNotice ()
2008-12-23 19:33:23 +00:00
{
2009-01-22 22:51:37 +00:00
if ( $this -> mode != 'sent' ) {
if ( $this -> error ) {
$this -> element ( 'p' , 'error' , $this -> error );
} else {
$this -> elementStart ( 'div' , 'instructions' );
$this -> element ( 'p' , null ,
2010-10-19 23:35:39 +01:00
// TRANS: Form instructions.
2009-01-22 22:51:37 +00:00
_ ( 'Use this form to invite your friends and colleagues to use this service.' ));
$this -> elementEnd ( 'div' );
}
2008-12-23 19:19:07 +00:00
}
}
2009-01-22 22:51:37 +00:00
function showForm ( $error = null )
2008-12-23 19:33:23 +00:00
{
2009-01-22 22:51:37 +00:00
$this -> mode = 'form' ;
$this -> error = $error ;
$this -> showPage ();
}
2008-12-23 19:19:07 +00:00
2009-01-22 22:51:37 +00:00
function showInviteForm ()
{
2011-05-10 01:07:36 +01:00
if ( Event :: handle ( 'StartShowInviteForm' , array ( $this ))) {
$form = new InviteForm ( $this );
$form -> show ();
Event :: handle ( 'EndShowInviteForm' , array ( $this ));
}
2008-12-23 19:19:07 +00:00
}
2009-01-22 22:51:37 +00:00
function sendInvitation ( $email , $user , $personal )
2008-12-23 19:33:23 +00:00
{
2008-12-23 19:19:07 +00:00
$profile = $user -> getProfile ();
$bestname = $profile -> getBestName ();
$sitename = common_config ( 'site' , 'name' );
$invite = new Invitation ();
$invite -> address = $email ;
$invite -> address_type = 'email' ;
$invite -> code = common_confirmation_code ( 128 );
$invite -> user_id = $user -> id ;
$invite -> created = common_sql_now ();
if ( ! $invite -> insert ()) {
common_log_db_error ( $invite , 'INSERT' , __FILE__ );
return false ;
}
2011-04-18 14:04:11 +01:00
$confirmUrl = common_local_url ( 'register' , array ( 'code' => $invite -> code ));
2008-12-23 19:19:07 +00:00
$recipients = array ( $email );
$headers [ 'From' ] = mail_notify_from ();
2009-07-27 21:02:03 +01:00
$headers [ 'To' ] = trim ( $email );
2011-04-18 14:04:11 +01:00
$headers [ 'Content-Type' ] = 'text/html; charset=UTF-8' ;
2010-10-19 23:35:39 +01:00
// TRANS: Subject for invitation email. Note that 'them' is correct as a gender-neutral
// TRANS: singular 3rd-person pronoun in English. %1$s is the inviting user, $2$s is
// TRANS: the StatusNet sitename.
2008-12-23 19:19:07 +00:00
$headers [ 'Subject' ] = sprintf ( _ ( '%1$s has invited you to join them on %2$s' ), $bestname , $sitename );
2011-04-18 14:04:11 +01:00
$title = ( empty ( $personal )) ? 'invite' : 'invitepersonal' ;
2011-04-19 00:13:28 +01:00
// @todo FIXME: i18n issue.
2011-04-18 15:10:38 +01:00
$inviteTemplate = DocFile :: forTitle ( $title , DocFile :: mailPaths ());
2011-04-18 14:04:11 +01:00
$body = $inviteTemplate -> toHTML ( array ( 'inviter' => $bestname ,
2011-04-18 18:40:27 +01:00
'inviterurl' => $profile -> profileurl ,
2011-04-18 14:04:11 +01:00
'confirmurl' => $confirmUrl ,
'personal' => $personal ));
common_debug ( 'Confirm URL is ' . common_local_url ( 'register' , array ( 'code' => $invite -> code )));
2008-12-23 19:19:07 +00:00
mail_send ( $recipients , $headers , $body );
}
2008-08-25 20:29:46 +01:00
}