* @file
* @ingroup SpecialPage
*/
+use MediaWiki\MediaWikiServices;
/**
* A special page that allows users to send e-mails to other users
}
protected function getFormFields() {
+ $linkRenderer = $this->getLinkRenderer();
return [
'From' => [
'type' => 'info',
'raw' => 1,
- 'default' => Linker::link(
+ 'default' => $linkRenderer->makeLink(
$this->getUser()->getUserPage(),
- htmlspecialchars( $this->getUser()->getName() )
+ $this->getUser()->getName()
),
'label-message' => 'emailfrom',
'id' => 'mw-emailuser-sender',
'To' => [
'type' => 'info',
'raw' => 1,
- 'default' => Linker::link(
+ 'default' => $linkRenderer->makeLink(
$this->mTargetObj->getUserPage(),
- htmlspecialchars( $this->mTargetObj->getName() )
+ $this->mTargetObj->getName()
),
'label-message' => 'emailto',
'id' => 'mw-emailuser-recipient',
public static function getPermissionsError( $user, $editToken, Config $config = null ) {
if ( $config === null ) {
wfDebug( __METHOD__ . ' called without a Config instance passed to it' );
- $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+ $config = MediaWikiServices::getInstance()->getMainConfig();
}
if ( !$config->get( 'EnableEmail' ) || !$config->get( 'EnableUserEmail' ) ) {
return 'usermaildisabled';
* @since 1.20
* @param array $data
* @param HTMLForm $form
- * @return Status|string|bool
+ * @return Status|bool
*/
public static function uiSubmit( array $data, HTMLForm $form ) {
return self::submit( $data, $form->getContext() );
*
* @param array $data
* @param IContextSource $context
- * @return Status|string|bool Status object, or potentially a String on error
- * or maybe even true on success if anything uses the EmailUser hook.
+ * @return Status|bool
*/
public static function submit( array $data, IContextSource $context ) {
$config = $context->getConfig();
$target = self::getTarget( $data['Target'] );
if ( !$target instanceof User ) {
// Messages used here: notargettext, noemailtext, nowikiemailtext
- return $context->msg( $target . 'text' )->parseAsBlock();
+ return Status::newFatal( $target . 'text' );
}
$to = MailAddress::newFromUser( $target );
$text .= $context->msg( 'emailuserfooter',
$from->name, $to->name )->inContentLanguage()->text();
- $error = '';
+ $error = false;
if ( !Hooks::run( 'EmailUser', [ &$to, &$from, &$subject, &$text, &$error ] ) ) {
- return $error;
+ if ( $error instanceof Status ) {
+ return $error;
+ } elseif ( $error === false || $error === '' || $error === [] ) {
+ // Possibly to tell HTMLForm to pretend there was no submission?
+ return false;
+ } elseif ( $error === true ) {
+ // Hook sent the mail itself and indicates success?
+ return Status::newGood();
+ } elseif ( is_array( $error ) ) {
+ $status = Status::newGood();
+ foreach ( $error as $e ) {
+ $status->fatal( $e );
+ }
+ return $status;
+ } elseif ( $error instanceof MessageSpecifier ) {
+ return Status::newFatal( $error );
+ } else {
+ // Ugh. Either a raw HTML string, or something that's supposed
+ // to be treated like one.
+ $type = is_object( $error ) ? get_class( $error ) : gettype( $error );
+ wfDeprecated( "EmailUser hook returning a $type as \$error", '1.29' );
+ return Status::newFatal( new ApiRawMessage(
+ [ '$1', Message::rawParam( (string)$error ) ], 'hookaborted'
+ ) );
+ }
}
if ( $config->get( 'UserEmailUseReplyTo' ) ) {
// unless they are emailing themselves, in which case one
// copy of the message is sufficient.
if ( $data['CCMe'] && $to != $from ) {
- $cc_subject = $context->msg( 'emailccsubject' )->rawParams(
+ $ccTo = $from;
+ $ccFrom = $from;
+ $ccSubject = $context->msg( 'emailccsubject' )->rawParams(
$target->getName(), $subject )->text();
-
- // target and sender are equal, because this is the CC for the sender
- Hooks::run( 'EmailUserCC', [ &$from, &$from, &$cc_subject, &$text ] );
-
- $ccStatus = UserMailer::send( $from, $from, $cc_subject, $text );
+ $ccText = $text;
+
+ Hooks::run( 'EmailUserCC', [ &$ccTo, &$ccFrom, &$ccSubject, &$ccText ] );
+
+ if ( $config->get( 'UserEmailUseReplyTo' ) ) {
+ $mailFrom = new MailAddress(
+ $config->get( 'PasswordSender' ),
+ wfMessage( 'emailsender' )->inContentLanguage()->text()
+ );
+ $replyTo = $ccFrom;
+ } else {
+ $mailFrom = $ccFrom;
+ $replyTo = null;
+ }
+
+ $ccStatus = UserMailer::send(
+ $ccTo, $mailFrom, $ccSubject, $ccText, [
+ 'replyTo' => $replyTo,
+ ] );
$status->merge( $ccStatus );
}