71 parent::__construct(
'Emailuser' );
72 $this->userNameUtils = $userNameUtils;
73 $this->userNamePrefixSearch = $userNamePrefixSearch;
74 $this->userOptionsLookup = $userOptionsLookup;
75 $this->emailUserFactory = $emailUserFactory;
76 $this->userFactory = $userFactory;
84 return $this->
msg(
'emailuser-title-notarget' );
94 'default' => $linkRenderer->makeLink(
98 'label-message' =>
'emailfrom',
99 'id' =>
'mw-emailuser-sender',
104 'default' => $linkRenderer->makeLink(
108 'label-message' =>
'emailto',
109 'id' =>
'mw-emailuser-recipient',
113 'default' => $target->
getName(),
117 'default' => $this->
msg(
'defemailsubject', $user->getName() )->inContentLanguage()->text(),
118 'label-message' =>
'emailsubject',
124 'type' =>
'textarea',
126 'label-message' =>
'emailmessage',
131 'label-message' =>
'emailccme',
132 'default' => $this->userOptionsLookup->getBoolOption( $user,
'ccmeonemails' ),
143 $out->addModuleStyles(
'mediawiki.special' );
146 $emailUser = $this->emailUserFactory->newEmailUserBC(
150 $emailUser->setEditToken( (
string)$request->getVal(
'wpEditToken' ) );
151 $status = $emailUser->canSend();
153 if ( !$status->isGood() ) {
155 $status->throwErrorPageError();
156 } elseif ( $status->hasMessage(
'mailnologin' ) ) {
158 } elseif ( $status->hasMessage(
'usermaildisabled' ) ) {
159 throw new ErrorPageError(
'usermaildisabled',
'usermaildisabledtext' );
160 } elseif ( $status->getValue() !==
null ) {
163 $error = $status->getErrors()[0];
164 throw new ErrorPageError( $status->getValue(), $error[
'message'], $error[
'params'] );
173 $target = $par ?? $request->getVal(
'wpTarget', $request->getVal(
'target',
'' ) );
188 if ( !$targetObject instanceof
User ) {
193 ->newEmailUser( $sender )
194 ->validateTarget( $targetObject );
195 if ( !$status->isGood() ) {
196 $msg = $status->getErrors()[0][
'message'];
197 $ret = $msg ===
'emailnotarget' ?
'notarget' : preg_replace(
'/text$/',
'', $msg );
199 $ret = $targetObject;
214 if ( !$target instanceof
User ) {
218 ->newEmailUser( $sender )
219 ->validateTarget( $target );
220 if ( $status->isGood() ) {
223 $msg = $status->getErrors()[0][
'message'];
224 $ret = $msg ===
'emailnotarget' ?
'notarget' : preg_replace(
'/text$/',
'', $msg );
244 $emailUser->setEditToken( (
string)$editToken );
245 $status = $authorize ? $emailUser->authorizeSend() : $emailUser->canSend();
247 if ( $status->isGood() ) {
250 foreach ( $status->getErrors() as $err ) {
251 $errKey = $err[
'message'] instanceof
Message ? $err[
'message']->
getKey() : $err[
'message'];
252 if ( strpos( $errKey,
'blockedtext' ) !==
false ) {
254 return "blockedemailuser";
257 $error = $status->getErrors()[0];
258 if ( $status->getValue() !==
null ) {
260 return [ $status->getValue(), $error[
'message'], $error[
'params'] ];
262 return $error[
'message'];
271 $htmlForm = HTMLForm::factory(
'ooui', [
276 'label-message' =>
'emailusername',
277 'id' =>
'emailusertarget',
282 'filter-callback' =>
static function ( $value ) use ( $name ) {
283 return str_replace(
'_',
' ',
284 ( $value !==
'' && $value !==
false && $value !==
null ) ? $value : $name );
286 'validation-callback' =>
function ( $value ) {
288 $target = $this->userFactory->newFromName( $value );
289 $statusValue = $this->emailUserFactory
292 if ( !$statusValue->isGood() ) {
294 return Status::wrap( $statusValue )->getMessage();
304 ->setSubmitCallback( [ $this,
'sendEmailForm' ] )
305 ->setId(
'askusername' )
306 ->setWrapperLegendMsg(
'emailtarget' )
307 ->setSubmitTextMsg(
'emailusernamesubmit' )
319 $target = $this->userFactory->newFromName( $data[
'Target'] );
324 ->addPreHtml( $this->
msg(
'emailpagetext', $target->getName() )->parse() )
325 ->setSubmitTextMsg(
'emailsend' )
326 ->setSubmitCallback( [ $this,
'onFormSubmit' ] )
327 ->setWrapperLegendMsg(
'email-legend' )
330 if ( !$this->
getHookRunner()->onEmailUserForm( $htmlForm ) ) {
334 $result = $htmlForm->show();
336 if ( $result ===
true || ( $result instanceof
Status && $result->
isGood() ) ) {
337 $out->setPageTitleMsg( $this->
msg(
'emailsent' ) );
338 $out->addWikiMsg(
'emailsenttext', $target->getName() );
339 $out->returnToMain(
false, $target->getUserPage() );
341 $out->setPageTitleMsg( $this->
msg(
'emailuser-title-target', $target->getName() ) );
353 $target = $this->userFactory->newFromName( $data[
'Target'] );
355 $emailUser = $this->emailUserFactory->newEmailUser( $this->
getAuthority() );
356 $emailUser->setEditToken( $this->
getRequest()->getVal(
'wpEditToken' ) );
359 $status = $emailUser->authorizeSend();
361 if ( !$status->isOK() ) {
366 $res = $emailUser->sendEmailUnsafe(
373 if ( $res->hasMessage(
'hookaborted' ) ) {
378 $res = Status::wrap( $res );
395 if ( !$target instanceof
User ) {
396 return Status::newFatal(
'emailnotarget' );
402 $ret = $emailUser->sendEmailUnsafe(
404 (
string)$data[
'Subject'],
405 (
string)$data[
'Text'],
409 if ( $ret->hasMessage(
'hookaborted' ) ) {
412 } elseif ( $ret->hasMessage(
'noemailtarget' ) ) {
415 return Status::newFatal(
'notargettext' );
417 $ret = Status::wrap( $ret );
431 $search = $this->userNameUtils->getCanonical( $search );
437 return $this->userNamePrefixSearch
438 ->search( UserNamePrefixSearch::AUDIENCE_PUBLIC, $search, $limit, $offset );
454class_alias( SpecialEmailUser::class,
'SpecialEmailUser' );
An error page which can definitely be safely rendered using the OutputPage.
A class containing constants representing the names of configuration variables.
const EnableUserEmail
Name constant for the EnableUserEmail setting, for use with Config::get()
Parent class for all special pages.
setHeaders()
Sets headers - this should be called from the execute() method of all derived classes!
getUser()
Shortcut to get the User executing this instance.
getPageTitle( $subpage=false)
Get a self-referential title object.
getConfig()
Shortcut to get main config object.
getContext()
Gets the context this SpecialPage is executed in.
getRequest()
Get the WebRequest being used for this instance.
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.
getOutput()
Get the OutputPage being used for this instance.
getAuthority()
Shortcut to get the Authority executing this instance.
getLanguage()
Shortcut to get user's language.
outputHeader( $summaryMessageKey='')
Outputs a summary message on top of special pages Per default the message key is the canonical name o...
Generic operation result class Has warning/error list, boolean status and arbitrary value.
isGood()
Returns whether the operation completed and didn't have any error or warnings.
Interface for objects which can provide a MediaWiki context on request.
getConfig()
Get the site configuration.