/** * Check for sufficient permissions to execute * @param ApiBase $module An Api module */ protected function checkExecutePermissions($module) { $user = $this->getUser(); if ($module->isReadMode() && !User::isEveryoneAllowed('read') && !$user->isAllowed('read')) { $this->dieUsageMsg('readrequired'); } if ($module->isWriteMode()) { if (!$this->mEnableWrite) { $this->dieUsageMsg('writedisabled'); } if (!$user->isAllowed('writeapi')) { $this->dieUsageMsg('writerequired'); } if (wfReadOnly()) { $this->dieReadOnly(); } } // Allow extensions to stop execution for arbitrary reasons. $message = false; if (!Hooks::run('ApiCheckCanExecute', array($module, $user, &$message))) { $this->dieUsageMsg($message); } }
/** * Check if the DB is read-only for this user * @param ApiBase $module An Api module */ protected function checkReadOnly($module) { if (wfReadOnly()) { $this->dieReadOnly(); } if ($module->isWriteMode() && in_array('bot', $this->getUser()->getGroups()) && wfGetLB()->getServerCount() > 1) { // Figure out how many servers have passed the lag threshold $numLagged = 0; $lagLimit = $this->getConfig()->get('APIMaxLagThreshold'); foreach (wfGetLB()->getLagTimes() as $lag) { if ($lag > $lagLimit) { ++$numLagged; } } // If a majority of slaves are too lagged then disallow writes $slaveCount = wfGetLB()->getServerCount() - 1; if ($numLagged >= ceil($slaveCount / 2)) { $parsed = $this->parseMsg(array('readonlytext')); $this->dieUsage($parsed['info'], $parsed['code'], 0, array('readonlyreason' => "Waiting for {$numLagged} lagged database(s)")); } } }
/** * Set database connection, query, and write expectations given this module request * @param ApiBase $module */ protected function setRequestExpectations(ApiBase $module) { $limits = $this->getConfig()->get('TrxProfilerLimits'); $trxProfiler = Profiler::instance()->getTransactionProfiler(); if ($this->getRequest()->wasPosted()) { if ($module->isWriteMode()) { $trxProfiler->setExpectations($limits['POST'], __METHOD__); } else { $trxProfiler->setExpectations($limits['POST-nonwrite'], __METHOD__); } } else { $trxProfiler->setExpectations($limits['GET'], __METHOD__); } }
/** * Set database connection, query, and write expectations given this module request * @param ApiBase $module */ protected function setRequestExpectations(ApiBase $module) { $limits = $this->getConfig()->get('TrxProfilerLimits'); $trxProfiler = Profiler::instance()->getTransactionProfiler(); $trxProfiler->setLogger(LoggerFactory::getInstance('DBPerformance')); if ($this->getRequest()->hasSafeMethod()) { $trxProfiler->setExpectations($limits['GET'], __METHOD__); } elseif ($this->getRequest()->wasPosted() && !$module->isWriteMode()) { $trxProfiler->setExpectations($limits['POST-nonwrite'], __METHOD__); $this->getRequest()->markAsSafeRequest(); } else { $trxProfiler->setExpectations($limits['POST'], __METHOD__); } }