Matthias Mullie has uploaded a new change for review.
https://gerrit.wikimedia.org/r/214342
Change subject: Don't log exception when missing permissions, just ignore it
......................................................................
Don't log exception when missing permissions, just ignore it
formatApi() fails on a couple of occasions, one of which being when
a user has insufficient permissions. That's an "acceptable" error:
we shouldn't log it, just ignore that row.
Some places already counter this by first checking permissions, then
passing it off to formatApi() - if that one fails, it's not a
permission issue & we should log the failure.
Let's just throw an exception right away if it's a real error case,
and return false if it's a "this is no error but we can't show you
the data" case. Makes dealing with this simpler.
One potential regression: this formatApi function is not just called
from RC, Contribs, ... formatters, but also in other places
(everywhere...), so adding a new exception in there might break
those other places.
The first check was already being logged if it was being hit, and I
couldn't find it in the logs; so pretty sure we won't see it happen.
Change-Id: Icb26b999f16e591fccadb9dce2913e55d50bb7a2
---
M Hooks.php
M includes/Formatter/Contributions.php
M includes/Formatter/FeedItemFormatter.php
M includes/Formatter/IRCLineUrlFormatter.php
M includes/Formatter/RecentChanges.php
M includes/Formatter/RevisionFormatter.php
6 files changed, 51 insertions(+), 78 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Flow
refs/changes/42/214342/1
diff --git a/Hooks.php b/Hooks.php
index 245bca3..31f53fc 100644
--- a/Hooks.php
+++ b/Hooks.php
@@ -391,7 +391,7 @@
/** @var Flow\Formatter\RecentChanges $formatter */
$formatter = Container::get( 'formatter.recentchanges'
);
- $links = $formatter->getLogTextLinks( $row,
$changesList, $block, $links );
+ $logTextLinks = $formatter->getLogTextLinks( $row,
$changesList, $block, $links );
} catch ( Exception $e ) {
wfDebugLog( 'Flow', __METHOD__ . ': Exception
formatting rc logtext ' . $rc->getAttribute( 'rc_id' ) . ' ' . $e );
MWExceptionHandler::logException( $e );
@@ -400,6 +400,11 @@
}
restore_error_handler();
+ if ( $logTextLinks === false ) {
+ return false;
+ }
+
+ $links = $logTextLinks;
return true;
}
@@ -623,6 +628,7 @@
$formatter = Container::get( 'formatter.contributions'
);
$line = $formatter->format( $row, $pager );
} catch ( Exception $e ) {
+ wfDebugLog( 'Flow', __METHOD__ . ': Failed formatting
contribution ' . json_encode( $row ) . ': ' . $e->getMessage() );
MWExceptionHandler::logException( $e );
$line = false;
}
@@ -677,9 +683,15 @@
}
set_error_handler( new Flow\RecoverableErrorHandler, -1 );
- /** @var Flow\Formatter\Contributions $formatter */
- $formatter = Container::get( 'formatter.contributions.feeditem'
);
- $result = $formatter->format( $row, $ctx );
+ try {
+ /** @var Flow\Formatter\FeedItemFormatter $formatter */
+ $formatter = Container::get(
'formatter.contributions.feeditem' );
+ $result = $formatter->format( $row, $ctx );
+ } catch ( Exception $e ) {
+ wfDebugLog( 'Flow', __METHOD__ . ': Failed formatting
contribution ' . json_encode( $row ) . ': ' . $e->getMessage() );
+ MWExceptionHandler::logException( $e );
+ return false;
+ }
restore_error_handler();
if ( $result instanceof FeedItem ) {
@@ -908,8 +920,8 @@
$formatter = Container::get( 'formatter.irclineurl' );
$result = $formatter->format( $rc );
} catch ( Exception $e ) {
- wfDebugLog( 'Flow', __METHOD__ . ': Failed formatting
rc ' . $rc->getAttribute( 'rc_id' )
- . ': ' . $e->getMessage() );
+ $result = null;
+ wfDebugLog( 'Flow', __METHOD__ . ': Failed formatting
rc ' . $rc->getAttribute( 'rc_id' ) . ': ' . $e->getMessage() );
MWExceptionHandler::logException( $e );
}
restore_error_handler();
diff --git a/includes/Formatter/Contributions.php
b/includes/Formatter/Contributions.php
index bd98466..b38cab1 100644
--- a/includes/Formatter/Contributions.php
+++ b/includes/Formatter/Contributions.php
@@ -19,34 +19,13 @@
* @param FormatterRow $row With properties workflow, revision,
previous_revision
* @param IContextSource $ctx
* @return string|false HTML for contributions entry, or false on
failure
- */
- public function format( FormatterRow $row, IContextSource $ctx ) {
- try {
- if ( !$this->permissions->isAllowed( $row->revision,
'contributions' ) ) {
- return false;
- }
- if ( $row->revision instanceof PostRevision &&
- !$this->permissions->isAllowed( $row->rootPost,
'contributions' ) ) {
- return false;
- }
- return $this->formatHtml( $row, $ctx );
- } catch ( FlowException $e ) {
- \MWExceptionHandler::logException( $e );
- return false;
- }
- }
-
- /**
- * @param FormatterRow $row
- * @param IContextSource $ctx
- * @return string
* @throws FlowException
*/
- protected function formatHtml( FormatterRow $row, IContextSource $ctx )
{
+ public function format( FormatterRow $row, IContextSource $ctx ) {
$this->serializer->setIncludeHistoryProperties( true );
- $data = $this->serializer->formatApi( $row, $ctx );
+ $data = $this->serializer->formatApi( $row, $ctx,
'contributions' );
if ( !$data ) {
- throw new FlowException( 'Could not format data for row
' . $row->revision->getRevisionId()->getAlphadecimal() );
+ return false;
}
$charDiff = ChangesList::showCharacterDifference(
diff --git a/includes/Formatter/FeedItemFormatter.php
b/includes/Formatter/FeedItemFormatter.php
index f92fc93..f182d35 100644
--- a/includes/Formatter/FeedItemFormatter.php
+++ b/includes/Formatter/FeedItemFormatter.php
@@ -17,29 +17,13 @@
* @param FormatterRow $row With properties workflow, revision,
previous_revision
* @param IContextSource $ctx
* @return FeedItem|false The requested format, or false on failure
+ * @throws FlowException
*/
public function format( FormatterRow $row, IContextSource $ctx ) {
- try {
- if ( !$this->permissions->isAllowed( $row->revision,
'history' ) ) {
- return false;
- }
- if ( $row->revision instanceof PostRevision &&
- !$this->permissions->isAllowed( $row->rootPost,
'history' ) ) {
- return false;
- }
-
- return $this->createFeedItem( $row, $ctx );
- } catch ( Exception $e ) {
- \MWExceptionHandler::logException( $e );
- return false;
- }
- }
-
- protected function createFeedItem( FormatterRow $row, IContextSource
$ctx ) {
$this->serializer->setIncludeHistoryProperties( true );
- $data = $this->serializer->formatApi( $row, $ctx );
+ $data = $this->serializer->formatApi( $row, $ctx,
'contributions' );
if ( !$data ) {
- throw new FlowException( 'Could not format data for row
' . $row->revision->getRevisionId()->getAlphadecimal() );
+ return false;
}
$preferredLinks = array(
diff --git a/includes/Formatter/IRCLineUrlFormatter.php
b/includes/Formatter/IRCLineUrlFormatter.php
index f8824c6..edae039 100644
--- a/includes/Formatter/IRCLineUrlFormatter.php
+++ b/includes/Formatter/IRCLineUrlFormatter.php
@@ -36,12 +36,21 @@
/**
* Allows us to set the rc_comment field
*/
+ /**
+ * @param array $feed
+ * @param RecentChange $rc
+ * @param null|string $actionComment
+ * @return string|null Text for IRC line, or null on failure
+ */
public function getLine( array $feed, RecentChange $rc, $actionComment
) {
$ctx = \RequestContext::getMain();
- $rc->mAttribs['rc_comment'] = $this->formatDescription(
- $this->serializeRcRevision( $rc, $ctx ),
- $ctx
- );
+
+ $serialized = $this->serializeRcRevision( $rc, $ctx );
+ if ( !$serialized ) {
+ return null;
+ }
+
+ $rc->mAttribs['rc_comment'] = $this->formatDescription(
$serialized, $ctx );
/** @var RCFeedFormatter $formatter */
$formatter = new $feed['original_formatter']();
@@ -58,12 +67,7 @@
$rcRow = $query->getResult( null, $rc );
$this->serializer->setIncludeHistoryProperties( true );
- $data = $this->serializer->formatApi( $rcRow, $ctx );
- if ( !$data ) {
- throw new FlowException( 'Could not format data for row
' . $rcRow->revision->getRevisionId()->getAlphadecimal() );
- }
-
- return $data;
+ return $this->serializer->formatApi( $rcRow, $ctx,
'recentchanges' );
}
/**
diff --git a/includes/Formatter/RecentChanges.php
b/includes/Formatter/RecentChanges.php
index 1c0d684..ad87b81 100644
--- a/includes/Formatter/RecentChanges.php
+++ b/includes/Formatter/RecentChanges.php
@@ -24,16 +24,12 @@
* @throws FlowException
*/
public function format( RecentChangesRow $row, IContextSource $ctx,
$linkOnly = false ) {
- if ( !$this->permissions->isAllowed( $row->revision,
'recentchanges' ) ) {
- return false;
- }
-
$this->serializer->setIncludeHistoryProperties( true );
$this->serializer->setIncludeContent( false );
$data = $this->serializer->formatApi( $row, $ctx,
'recentchanges' );
if ( !$data ) {
- throw new FlowException( 'Could not format data for row
' . $row->revision->getRevisionId()->getAlphadecimal() );
+ return false;
}
if ( $linkOnly ) {
@@ -159,19 +155,19 @@
* @param IContextSource $ctx
* @param array $block
* @param array $links
- * @return array
+ * @return array|false Links array, or false on failure
* @throws FlowException
* @throws \Flow\Exception\InvalidInputException
*/
public function getLogTextLinks( RecentChangesRow $row, IContextSource
$ctx, array $block, array $links = array() ) {
- $old = unserialize( $block[count( $block ) -
1]->mAttribs['rc_params'] );
- $oldId = $old ? UUID::create(
$old['flow-workflow-change']['revision'] ) : $row->revision->getRevisionId();
-
$data = $this->serializer->formatApi( $row, $ctx,
'recentchanges' );
if ( !$data ) {
- throw new FlowException( 'Could not format data for row
' . $row->revision->getRevisionId()->getAlphadecimal() );
+ return false;
}
+ $old = unserialize( $block[count( $block ) -
1]->mAttribs['rc_params'] );
+ $oldId = $old ? UUID::create(
$old['flow-workflow-change']['revision'] ) : $row->revision->getRevisionId();
+
if ( isset( $data['links']['topic'] ) ) {
// add highlight details to anchor
/** @var Anchor $anchor */
diff --git a/includes/Formatter/RevisionFormatter.php
b/includes/Formatter/RevisionFormatter.php
index 10d5ea2..6723f83 100644
--- a/includes/Formatter/RevisionFormatter.php
+++ b/includes/Formatter/RevisionFormatter.php
@@ -165,12 +165,12 @@
*/
public function formatApi( FormatterRow $row, IContextSource $ctx,
$action = 'view' ) {
$user = $ctx->getUser();
+
// @todo the only permissions currently checked in this class
are prev-revision
// mostly permissions is used for the actions, figure out how
permissions should
// fit into this class either used more or not at all.
if ( $user->getName() !==
$this->permissions->getUser()->getName() ) {
- wfDebugLog( 'Flow', __METHOD__ . ': Formatting for
wrong user' );
- return false;
+ throw new FlowException( 'Formatting for wrong user' );
}
if ( !$this->permissions->isAllowed( $row->revision, $action )
) {
@@ -251,13 +251,11 @@
'watchable',
)
);
- if (
- $row->summary &&
- $this->permissions->isAllowed(
$row->summary->revision, 'view' )
- ) {
- $res['summary'] = array(
- 'revision' => $this->formatApi(
$row->summary, $ctx )
- );
+ if ( $row->summary ) {
+ $summary = $this->formatApi( $row->summary,
$ctx, $action );
+ if ( $summary ) {
+ $res['summary'] = $summary;
+ }
}
// Only non-anon users can watch/unwatch a flow topic
--
To view, visit https://gerrit.wikimedia.org/r/214342
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Icb26b999f16e591fccadb9dce2913e55d50bb7a2
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Flow
Gerrit-Branch: master
Gerrit-Owner: Matthias Mullie <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits