mediawiki-extensions-NewSig.../includes/auth/NewSignupPageSecondaryAuthe...

159 行
5.8 KiB
PHP

<?php
use MediaWiki\Auth\AbstractSecondaryAuthenticationProvider;
use MediaWiki\Auth\AuthenticationRequest;
use MediaWiki\Auth\AuthenticationResponse;
use MediaWiki\Auth\AuthManager;
use MediaWiki\MediaWikiServices;
/**
* @license GPL-2.0-or-later
* @note Uses GPL-licensed code from LoginReg extension (in beginSecondaryAccountCreation())
*/
class NewSignupPageSecondaryAuthenticationProvider extends AbstractSecondaryAuthenticationProvider
{
/**
* @param array $params
*/
public function __construct($params = [])
{
}
/**
* Abort the creation of the new account if the user hasn't checked the
* "I agree to the terms of service" checkbox and they aren't allowed to
* bypass that check.
*
* @param User $user
* @param User $creator
* @param array $reqs
* @return StatusValue
*/
public function testForAccountCreation($user, $creator, array $reqs)
{
$req = AuthenticationRequest::getRequestByClass($reqs, NewSignupPageAuthenticationRequest::class);
if (
$req && $req->wpTermsOfService ||
$creator->isAllowed('bypasstoscheck')
) {
return StatusValue::newGood();
} else {
return StatusValue::newFatal('newsignuppage-must-accept-tos');
}
}
public function getAuthenticationRequests($action, array $options)
{
if ($action === AuthManager::ACTION_CREATE || $action === AuthManager::ACTION_LOGIN) {
return [new NewSignupPageAuthenticationRequest(
$this->manager->getRequest()
)];
}
return [];
}
public function beginSecondaryAuthentication($user, array $reqs)
{
return AuthenticationResponse::newAbstain();
}
public function beginSecondaryAccountCreation($user, $creator, array $reqs)
{
global $wgAutoAddFriendOnInvite, $wgRegisterTrack;
$req = AuthenticationRequest::getRequestByClass(
$reqs,
NewSignupPageAuthenticationRequest::class
);
$referral_user = User::newFromName($req->referral);
$user_id_referral = 0;
if ($wgAutoAddFriendOnInvite && $referral_user instanceof User) {
$user_id_referral = $referral_user->getId();
if ($user_id_referral) {
// need to create fake request first
$rel = new UserRelationship($referral_user);
$request_id = $rel->addRelationshipRequest($user, 1, '', false);
// clear the status
$rel->updateRelationshipRequestStatus($request_id, 1);
// automatically add relationships
$rel = new UserRelationship($user);
$rel->addRelationship($request_id, true);
// Update social statistics for both users (so that we don't
// show "0 of 0" in the new user's profile when they in fact
// do have one friend already!)
// @todo FIXME: broken until UserStatsTrack is refactored to support RequestContext
// instead of global objects (the global object in incStatField() is _not_
// our $user even though by all logic it should be and it was in older versions
// of MW)
$stats = new UserStatsTrack($user->getId(), $user->getName());
$stats->updateRelationshipCount(1);
$stats->incStatField('friend');
$statsReferringUser = new UserStatsTrack($user_id_referral, $referral_user->getName());
$statsReferringUser->updateRelationshipCount(1);
$statsReferringUser->incStatField('friend');
}
}
if ($wgRegisterTrack) {
$cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
$cache->delete($cache->makeKey('users', 'new', '1'));
// How the user registered (via email from friend, just on the site etc.)?
$from = $req->from;
if (!$from) {
$from = 0;
}
// Track if the user clicked on email from friend
if ($referral_user instanceof User) {
// Update the social statistics of the referring user (to give
// them points, if specified so on the configuration file)
$stats = new UserStatsTrack($referral_user->getId(), $referral_user->getName());
$stats->incStatField('referral_complete');
// Add a new site activity event that will show up on the output
// of <siteactivity /> at least
if (class_exists('UserSystemMessage')) {
$m = new UserSystemMessage();
// Nees to be forContent because addMessage adds this into a
// database table - we don't want to display Japanese text
// to English users
$message = wfMessage(
'newsignuppage-recruited',
$user->getUserPage()->getFullURL(),
$user->getName()
)->parse();
$m->addMessage(
$referral_user,
UserSystemMessage::TYPE_RECRUIT,
$message
);
}
}
// Track registration
$dbw = wfGetDB(DB_MASTER);
$dbw->insert(
'user_register_track',
[
'ur_actor' => $user->getActorId(),
'ur_actor_referral' => ($referral_user instanceof User ? $referral_user->getActorId() : 0),
'ur_from' => $from,
'ur_date' => $dbw->timestamp(date('Y-m-d H:i:s'))
],
__METHOD__
);
}
return AuthenticationResponse::newPass();
}
}