2007-02-12 14:50:29 -07:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Speclial:Contact, a contact form for visitors.
|
|
|
|
* Based on SpecialEmailUser.php
|
2008-02-03 07:37:27 -07:00
|
|
|
*
|
2007-02-12 14:50:29 -07:00
|
|
|
* @addtogroup SpecialPage
|
|
|
|
* @author Daniel Kinzler, brightbyte.de
|
|
|
|
* @copyright © 2007 Daniel Kinzler
|
|
|
|
* @licence GNU General Public Licence 2.0 or later
|
|
|
|
*/
|
|
|
|
|
2007-02-13 15:33:42 -07:00
|
|
|
if( !defined( 'MEDIAWIKI' ) ) {
|
|
|
|
echo( "not a valid entry point.\n" );
|
|
|
|
die( 1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
global $IP; #needed when called from the autoloader
|
|
|
|
require_once("$IP/includes/UserMailer.php");
|
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
class SpecialContact extends SpecialPage {
|
2008-02-03 07:37:27 -07:00
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*/
|
|
|
|
function __construct() {
|
|
|
|
global $wgOut;
|
|
|
|
SpecialPage::SpecialPage( 'Contact', '', true );
|
|
|
|
}
|
2008-02-03 07:37:27 -07:00
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
/**
|
|
|
|
* Main execution function
|
|
|
|
* @param $par Parameters passed to the page
|
|
|
|
*/
|
|
|
|
function execute( $par ) {
|
|
|
|
global $wgUser, $wgOut, $wgRequest, $wgEnableEmail, $wgContactUser, $wgContactSender;
|
2008-02-03 07:37:27 -07:00
|
|
|
|
|
|
|
wfLoadExtensionMessages( 'ContactPage' );
|
2007-04-18 06:41:35 -06:00
|
|
|
$fname = "SpecialContact::execute";
|
2008-02-03 07:37:27 -07:00
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
if( !$wgEnableEmail || !$wgContactUser || !$wgContactSender) {
|
|
|
|
$wgOut->showErrorPage( "nosuchspecialpage", "nospecialpagetext" );
|
|
|
|
return;
|
|
|
|
}
|
2008-02-03 07:37:27 -07:00
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
$action = $wgRequest->getVal( 'action' );
|
2008-02-03 07:37:27 -07:00
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
$nu = User::newFromName( $wgContactUser );
|
|
|
|
if( is_null( $nu ) || !$nu->canReceiveEmail() ) {
|
|
|
|
wfDebug( "Target is invalid user or can't receive.\n" );
|
|
|
|
$wgOut->showErrorPage( "noemailtitle", "noemailtext" );
|
|
|
|
return;
|
|
|
|
}
|
2008-02-03 07:37:27 -07:00
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
$f = new EmailContactForm( $nu );
|
2008-02-03 07:37:27 -07:00
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
if ( "success" == $action ) {
|
2007-04-18 06:41:35 -06:00
|
|
|
wfDebug( "$fname: success.\n" );
|
2007-02-12 14:50:29 -07:00
|
|
|
$f->showSuccess( );
|
2007-04-18 06:41:35 -06:00
|
|
|
} else if ( "submit" == $action && $wgRequest->wasPosted() ) {#
|
|
|
|
$token = $wgRequest->getVal( 'wpEditToken' );
|
|
|
|
|
|
|
|
if( $wgUser->isAnon() ) {
|
|
|
|
# Anonymous users may not have a session
|
|
|
|
# open. Check for suffix anyway.
|
|
|
|
$tokenOk = ( EDIT_TOKEN_SUFFIX == $token );
|
|
|
|
} else {
|
|
|
|
$tokenOk = $wgUser->matchEditToken( $token );
|
|
|
|
}
|
|
|
|
|
2007-10-13 05:41:44 -06:00
|
|
|
if ( !$tokenOk ) {
|
2007-04-18 06:41:35 -06:00
|
|
|
wfDebug( "$fname: bad token (".($wgUser->isAnon()?'anon':'user')."): $token\n" );
|
|
|
|
$wgOut->addWikiText( wfMsg( 'sessionfailure' ) );
|
|
|
|
$f->showForm();
|
2007-10-13 05:41:44 -06:00
|
|
|
} else if ( !$f->passCaptcha() ) {
|
|
|
|
wfDebug( "$fname: captcha failed" );
|
|
|
|
$wgOut->addWikiText( wfMsg( 'contactpage-captcha-failed' ) ); //TODO: provide a message for this!
|
|
|
|
$f->showForm();
|
|
|
|
} else {
|
|
|
|
wfDebug( "$fname: submit\n" );
|
|
|
|
$f->doSubmit();
|
2007-04-18 06:41:35 -06:00
|
|
|
}
|
2007-02-12 14:50:29 -07:00
|
|
|
} else {
|
2007-04-18 06:41:35 -06:00
|
|
|
wfDebug( "$fname: form\n" );
|
2007-02-12 14:50:29 -07:00
|
|
|
$f->showForm();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @todo document
|
|
|
|
* @addtogroup SpecialPage
|
|
|
|
*/
|
|
|
|
class EmailContactForm {
|
|
|
|
|
|
|
|
var $target;
|
|
|
|
var $text, $subject;
|
|
|
|
var $cc_me; // Whether user requested to be sent a separate copy of their email.
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param User $target
|
|
|
|
*/
|
|
|
|
function EmailContactForm( $target ) {
|
|
|
|
global $wgRequest, $wgUser;
|
2007-10-13 05:41:44 -06:00
|
|
|
global $wgCaptcha, $wgCaptchaTriggers;
|
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
$this->target = $target;
|
|
|
|
$this->text = $wgRequest->getText( 'wpText' );
|
|
|
|
$this->subject = $wgRequest->getText( 'wpSubject' );
|
|
|
|
$this->cc_me = $wgRequest->getBool( 'wpCCMe' );
|
|
|
|
|
|
|
|
$this->fromname = $wgRequest->getText( 'wpFromName' );
|
|
|
|
$this->fromaddress = $wgRequest->getText( 'wpFromAddress' );
|
|
|
|
|
|
|
|
if ($wgUser->isLoggedIn()) {
|
|
|
|
if (!$this->fromname) $this->fromname = $wgUser->getName();
|
|
|
|
if (!$this->fromaddress) $this->fromaddress = $wgUser->getEmail();
|
|
|
|
}
|
2007-10-13 05:41:44 -06:00
|
|
|
|
|
|
|
//prepare captcha if applicable
|
|
|
|
if ( $wgCaptcha && @$wgCaptchaTriggers['contactpage'] ) {
|
|
|
|
$wgCaptcha->trigger = 'contactpage';
|
|
|
|
$wgCaptcha->action = 'contact';
|
|
|
|
}
|
2007-02-12 14:50:29 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function showForm() {
|
|
|
|
global $wgOut, $wgUser, $wgContactSender;
|
|
|
|
|
|
|
|
#TODO: show captcha
|
|
|
|
|
2007-02-14 16:45:20 -07:00
|
|
|
$wgOut->setPagetitle( wfMsg( "contactpage-title" ) );
|
|
|
|
$wgOut->addWikiText( wfMsg( "contactpage-pagetext" ) );
|
2007-02-12 14:50:29 -07:00
|
|
|
|
|
|
|
if ( $this->subject === "" ) {
|
2007-02-16 15:20:14 -07:00
|
|
|
$this->subject = wfMsgForContent( "contactpage-defsubject" );
|
2007-02-12 14:50:29 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#$emf = wfMsg( "emailfrom" );
|
|
|
|
#$sender = $wgContactSender;
|
|
|
|
$emt = wfMsg( "emailto" );
|
|
|
|
$rcpt = $this->target->getName();
|
|
|
|
$emr = wfMsg( "emailsubject" );
|
|
|
|
$emm = wfMsg( "emailmessage" );
|
|
|
|
$ems = wfMsg( "emailsend" );
|
|
|
|
$emc = wfMsg( "emailccme" );
|
2007-02-14 16:45:20 -07:00
|
|
|
$emfn = wfMsg( "contactpage-fromname" );
|
|
|
|
$emfa = wfMsg( "contactpage-fromaddress" );
|
2007-02-12 14:50:29 -07:00
|
|
|
$encSubject = htmlspecialchars( $this->subject );
|
|
|
|
$encFromName = htmlspecialchars( $this->fromname );
|
|
|
|
$encFromAddress = htmlspecialchars( $this->fromaddress );
|
|
|
|
|
|
|
|
$titleObj = SpecialPage::getTitleFor( "Contact" );
|
|
|
|
$action = $titleObj->escapeLocalURL( "action=submit" );
|
2007-04-18 06:41:35 -06:00
|
|
|
$token = $wgUser->isAnon() ? EDIT_TOKEN_SUFFIX : $wgUser->editToken(); //this kind of sucks, really...
|
2007-06-23 04:15:10 -06:00
|
|
|
$token = htmlspecialchars( $token );
|
2007-02-12 14:50:29 -07:00
|
|
|
|
|
|
|
$wgOut->addHTML( "
|
|
|
|
<form id=\"emailuser\" method=\"post\" action=\"{$action}\">
|
|
|
|
<table border='0' id='mailheader'>
|
|
|
|
<tr>
|
|
|
|
<td align='right'>{$emr}:</td>
|
|
|
|
<td align='left'>
|
|
|
|
<input type='text' size='60' maxlength='200' name=\"wpSubject\" value=\"{$encSubject}\" />
|
|
|
|
</td>
|
|
|
|
</tr><tr>
|
|
|
|
<td align='right'>{$emfn}:</td>
|
|
|
|
<td align='left'>
|
|
|
|
<input type='text' size='60' maxlength='200' name=\"wpFromName\" value=\"{$encFromName}\" />
|
|
|
|
</td>
|
|
|
|
<tr>
|
|
|
|
<td align='right'>{$emfa}:</td>
|
|
|
|
<td align='left'>
|
|
|
|
<input type='text' size='60' maxlength='200' name=\"wpFromAddress\" value=\"{$encFromAddress}\" />
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td></td>
|
|
|
|
<td align='left'>
|
2007-02-14 16:45:20 -07:00
|
|
|
<small>".wfMsg( "contactpage-formfootnotes" )."</small>
|
2007-02-12 14:50:29 -07:00
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</table>
|
|
|
|
<span id='wpTextLabel'><label for=\"wpText\">{$emm}:</label><br /></span>
|
|
|
|
<textarea name=\"wpText\" rows='20' cols='80' wrap='virtual' style=\"width: 100%;\">" . htmlspecialchars( $this->text ) .
|
|
|
|
"</textarea>
|
|
|
|
" . wfCheckLabel( $emc, 'wpCCMe', 'wpCCMe', $wgUser->getBoolOption( 'ccmeonemails' ) ) . "<br />
|
2007-10-13 05:41:44 -06:00
|
|
|
" . $this->getCaptcha() . "
|
2007-02-12 14:50:29 -07:00
|
|
|
<input type='submit' name=\"wpSend\" value=\"{$ems}\" />
|
|
|
|
<input type='hidden' name='wpEditToken' value=\"$token\" />
|
|
|
|
</form>\n" );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2007-10-13 05:41:44 -06:00
|
|
|
function getCaptcha() {
|
|
|
|
global $wgCaptcha, $wgCaptchaTriggers;
|
|
|
|
if ( !$wgCaptcha ) return ""; //no captcha installed
|
|
|
|
if ( !@$wgCaptchaTriggers['contactpage'] ) return ""; //don't trigger on contact form
|
|
|
|
|
|
|
|
return "<div class='captcha'>" .
|
|
|
|
$wgCaptcha->getForm() .
|
|
|
|
wfMsgWikiHtml( 'contactpage-captcha' ) .
|
|
|
|
"</div>\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
function passCaptcha() {
|
|
|
|
global $wgCaptcha, $wgCaptchaTriggers;
|
|
|
|
if ( !$wgCaptcha ) return true; //no captcha installed
|
|
|
|
if ( !@$wgCaptchaTriggers['contactpage'] ) return true; //don't trigger on contact form
|
|
|
|
|
|
|
|
return $wgCaptcha->passCaptcha();
|
|
|
|
}
|
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
function doSubmit( ) {
|
|
|
|
global $wgOut, $wgContactSender, $wgContactSenderName;
|
|
|
|
|
|
|
|
#TODO: check captcha
|
|
|
|
|
|
|
|
$fname = 'EmailContactForm::doSubmit';
|
|
|
|
|
|
|
|
wfDebug( "$fname: start\n" );
|
|
|
|
|
|
|
|
$to = new MailAddress( $this->target );
|
|
|
|
$from = new MailAddress( $wgContactSender, $wgContactSenderName );
|
2008-02-03 07:37:27 -07:00
|
|
|
$replyto = $this->fromaddress ? new MailAddress( $this->fromaddress, $this->fromname ) : NULL;
|
2007-02-16 15:20:14 -07:00
|
|
|
$subject = trim( $this->subject );
|
|
|
|
|
|
|
|
if ( $subject === "" ) {
|
|
|
|
$subject = wfMsgForContent( "contactpage-defsubject" );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( $this->fromname !== "" ) {
|
|
|
|
$subject = wfMsgForContent( "contactpage-subject-and-sender", $subject, $this->fromname );
|
|
|
|
}
|
2007-02-12 14:50:29 -07:00
|
|
|
|
|
|
|
if( wfRunHooks( 'ContactForm', array( &$to, &$replyto, &$subject, &$this->text ) ) ) {
|
|
|
|
|
|
|
|
wfDebug( "$fname: sending mail from ".$from->toString()." to ".$to->toString()." replyto ".($replyto==null?'-/-':$replyto->toString())."\n" );
|
2007-02-14 16:45:20 -07:00
|
|
|
|
|
|
|
#HACK: in MW 1.9, replyto must be a string, in MW 1.0, it must be an object!
|
|
|
|
$ver = preg_replace( '![^\d._+]!', '', $GLOBALS['wgVersion'] );
|
2008-02-03 07:37:27 -07:00
|
|
|
$replyaddr = $replyto == null
|
|
|
|
? NULL : version_compare( $ver, '1.10', '<' )
|
2007-02-14 16:45:20 -07:00
|
|
|
? $replyto->toString() : $replyto;
|
|
|
|
|
2008-02-03 07:37:27 -07:00
|
|
|
$mailResult = userMailer( $to, $from, $subject, $this->text, $replyaddr );
|
2007-02-12 14:50:29 -07:00
|
|
|
|
|
|
|
if( WikiError::isError( $mailResult ) ) {
|
|
|
|
$wgOut->addHTML( wfMsg( "usermailererror" ) . $mailResult);
|
|
|
|
} else {
|
2008-02-03 07:37:27 -07:00
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
// if the user requested a copy of this mail, do this now,
|
|
|
|
// unless they are emailing themselves, in which case one copy of the message is sufficient.
|
|
|
|
if ($this->cc_me && $replyto) {
|
|
|
|
$cc_subject = wfMsg('emailccsubject', $this->target->getName(), $subject);
|
|
|
|
if( wfRunHooks( 'ContactForm', array( &$from, &$replyto, &$cc_subject, &$this->text ) ) ) {
|
|
|
|
wfDebug( "$fname: sending cc mail from ".$from->toString()." to ".$replyto->toString()."\n" );
|
2007-04-29 11:17:24 -06:00
|
|
|
$ccResult = userMailer( $replyto, $from, $cc_subject, $this->text );
|
2007-02-12 14:50:29 -07:00
|
|
|
if( WikiError::isError( $ccResult ) ) {
|
2008-02-03 07:37:27 -07:00
|
|
|
// At this stage, the user's CC mail has failed, but their
|
2007-02-12 14:50:29 -07:00
|
|
|
// original mail has succeeded. It's unlikely, but still, what to do?
|
|
|
|
// We can either show them an error, or we can say everything was fine,
|
2008-02-03 07:37:27 -07:00
|
|
|
// or we can say we sort of failed AND sort of succeeded. Of these options,
|
2007-02-12 14:50:29 -07:00
|
|
|
// simply saying there was an error is probably best.
|
|
|
|
$wgOut->addHTML( wfMsg( "usermailererror" ) . $ccResult);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-02-03 07:37:27 -07:00
|
|
|
|
2007-02-12 14:50:29 -07:00
|
|
|
wfDebug( "$fname: success\n" );
|
|
|
|
|
|
|
|
$titleObj = SpecialPage::getTitleFor( "Contact" );
|
|
|
|
$wgOut->redirect( $titleObj->getFullURL( "action=success" ) );
|
|
|
|
wfRunHooks( 'ContactFromComplete', array( $to, $replyto, $subject, $this->text ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
wfDebug( "$fname: end\n" );
|
|
|
|
}
|
|
|
|
|
|
|
|
function showSuccess( ) {
|
|
|
|
global $wgOut;
|
|
|
|
|
|
|
|
$wgOut->setPagetitle( wfMsg( "emailsent" ) );
|
|
|
|
$wgOut->addHTML( wfMsg( "emailsenttext" ) );
|
|
|
|
|
|
|
|
$wgOut->returnToMain( false );
|
|
|
|
}
|
|
|
|
}
|