Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F4171162
AbuseLoggerTest.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
AbuseLoggerTest.php
View Options
<?php
namespace
MediaWiki\Extension\AbuseFilter\Tests\Integration
;
use
MediaWiki\Context\RequestContext
;
use
MediaWiki\Deferred\DeferredUpdates
;
use
MediaWiki\Extension\AbuseFilter\AbuseFilterServices
;
use
MediaWiki\Extension\AbuseFilter\Filter\Flags
;
use
MediaWiki\Extension\AbuseFilter\Filter\MutableFilter
;
use
MediaWiki\Extension\AbuseFilter\Variables\VariableHolder
;
use
MediaWiki\Extension\AbuseFilter\Variables\VariablesBlobStore
;
use
MediaWikiIntegrationTestCase
;
/**
* @covers \MediaWiki\Extension\AbuseFilter\AbuseLogger
* @group Database
*/
class
AbuseLoggerTest
extends
MediaWikiIntegrationTestCase
{
use
FilterFromSpecsTestTrait
;
/**
* Tests that the AbuseFilter logs are sent to CheckUser, and that CheckUser actually inserts the row to the
* cu_private_event table.
*/
public
function
testSendingLogsToCheckUser
()
{
$this
->
markTestSkippedIfExtensionNotLoaded
(
'CheckUser'
);
AbuseFilterServices
::
getAbuseLoggerFactory
()->
newLogger
(
$this
->
getExistingTestPage
()->
getTitle
(),
$this
->
getTestUser
()->
getUser
(),
VariableHolder
::
newFromArray
(
[
'action'
=>
'edit'
]
)
)->
addLogEntries
(
[
1
=>
[
'warn'
]
]
);
// Sending the log to CheckUser happens on a DeferredUpdate, so we need to run the updates.
DeferredUpdates
::
doUpdates
();
// Assert that an insert into the cu_private_event table occurred for the abusefilter hit.
// This may be a bit brittle if the cu_private_event table schema changes, but as AbuseFilter is
// a dependency of CheckUser in CI and the columns checked are unlikely to change, this is acceptable.
$this
->
assertSame
(
1
,
(
int
)
$this
->
getDb
()->
newSelectQueryBuilder
()
->
select
(
'COUNT(*)'
)
->
from
(
'cu_private_event'
)
->
where
(
[
'cupe_log_type'
=>
'abusefilter'
,
'cupe_log_action'
=>
'hit'
]
)
->
fetchField
()
);
}
public
function
testVarDumpExcludesProtectedVariablesNotUsedByAssociatedFilter
()
{
RequestContext
::
getMain
()->
getRequest
()->
setIP
(
'1.2.3.4'
);
// Call our method under test to create two log entries, one for a filter that uses user_unnamed_ip and the
// other which does not.
$generatedLogIds
=
AbuseFilterServices
::
getAbuseLoggerFactory
()->
newLogger
(
$this
->
getExistingTestPage
()->
getTitle
(),
$this
->
getTestUser
()->
getUser
(),
VariableHolder
::
newFromArray
(
[
'action'
=>
'edit'
,
'user_type'
=>
'temp'
,
'user_unnamed_ip'
=>
'1.2.3.4'
,
'user_name'
=>
'~2024-1'
,
]
)
)->
addLogEntries
(
[
1
=>
[
'warn'
],
2
=>
[
'warn'
]
]
);
$this
->
assertCount
(
2
,
$generatedLogIds
[
'local'
]
);
/** @var VariablesBlobStore $variablesBlobStore */
$variablesBlobStore
=
$this
->
getServiceContainer
()->
get
(
VariablesBlobStore
::
SERVICE_NAME
);
// Assert that the log for the first filter has all the variables used in the first filter.
$logsForFirstFilter
=
$this
->
newSelectQueryBuilder
()
->
select
(
[
'afl_var_dump'
,
'afl_ip'
]
)
->
from
(
'abuse_filter_log'
)
->
where
(
[
'afl_filter_id'
=>
1
]
)
->
caller
(
__METHOD__
)
->
fetchResultSet
();
$this
->
assertSame
(
1
,
$logsForFirstFilter
->
numRows
()
);
$logsForFirstFilter
->
rewind
();
$varDumpForFirstLog
=
$variablesBlobStore
->
loadVarDump
(
$logsForFirstFilter
->
fetchObject
()
);
$this
->
assertArrayEquals
(
[
'user_unnamed_ip'
,
'user_type'
,
'user_name'
,
'action'
],
array_keys
(
$varDumpForFirstLog
->
getVars
()
)
);
// Assert that the log for the second filter does not have user_unnamed_ip in the var dump, as it
// is a protected variable that was not used in the second filter.
$logsForSecondFilter
=
$this
->
newSelectQueryBuilder
()
->
select
(
[
'afl_var_dump'
,
'afl_ip'
]
)
->
from
(
'abuse_filter_log'
)
->
where
(
[
'afl_filter_id'
=>
2
]
)
->
caller
(
__METHOD__
)
->
fetchResultSet
();
$this
->
assertSame
(
1
,
$logsForSecondFilter
->
numRows
()
);
$logsForSecondFilter
->
rewind
();
$varDumpForSecondLog
=
$variablesBlobStore
->
loadVarDump
(
$logsForSecondFilter
->
fetchObject
()
);
$this
->
assertArrayEquals
(
[
'user_type'
,
'user_name'
,
'action'
],
array_keys
(
$varDumpForSecondLog
->
getVars
()
)
);
}
public
function
addDBDataOnce
()
{
// Clear the protected access hooks, as in CI other extensions (such as CheckUser) may attempt to
// define additional restrictions that cause the tests to fail.
$this
->
clearHooks
(
[
'AbuseFilterCanViewProtectedVariables'
,
]
);
// Get two testing filters, one with protected variables and one without protected variables
$performer
=
$this
->
getTestSysop
()->
getUser
();
$this
->
assertStatusGood
(
AbuseFilterServices
::
getFilterStore
()->
saveFilter
(
$performer
,
null
,
$this
->
getFilterFromSpecs
(
[
'id'
=>
'1'
,
'name'
=>
'Filter with protected variables'
,
'privacy'
=>
Flags
::
FILTER_USES_PROTECTED_VARS
,
'rules'
=>
'user_unnamed_ip = "1.2.3.4" & user_name = "~2024-1" & user_type = "temp"'
,
]
),
MutableFilter
::
newDefault
()
)
);
$this
->
assertStatusGood
(
AbuseFilterServices
::
getFilterStore
()->
saveFilter
(
$performer
,
null
,
$this
->
getFilterFromSpecs
(
[
'id'
=>
'2'
,
'name'
=>
'Filter without protected variables'
,
'privacy'
=>
Flags
::
FILTER_PUBLIC
,
'rules'
=>
'user_name = "~2024-1"'
,
]
),
MutableFilter
::
newDefault
()
)
);
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Aug 20 2026, 06:06 (11 w, 3 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
8f/8f/b2b6dbaaa44d434f99bccd84631e
Default Alt Text
AbuseLoggerTest.php (5 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment