Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
20 / 20 |
|
100.00% |
3 / 3 |
CRAP | |
100.00% |
1 / 1 |
VariablesBlobStore | |
100.00% |
20 / 20 |
|
100.00% |
3 / 3 |
5 | |
100.00% |
1 / 1 |
__construct | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
1 | |||
storeVarDump | |
100.00% |
9 / 9 |
|
100.00% |
1 / 1 |
2 | |||
loadVarDump | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace MediaWiki\Extension\AbuseFilter\Variables; |
4 | |
5 | use FormatJson; |
6 | use MediaWiki\Storage\BlobAccessException; |
7 | use MediaWiki\Storage\BlobStore; |
8 | use MediaWiki\Storage\BlobStoreFactory; |
9 | |
10 | /** |
11 | * This service is used to store and load var dumps to a BlobStore |
12 | */ |
13 | class VariablesBlobStore { |
14 | public const SERVICE_NAME = 'AbuseFilterVariablesBlobStore'; |
15 | |
16 | /** @var VariablesManager */ |
17 | private $varManager; |
18 | |
19 | /** @var BlobStoreFactory */ |
20 | private $blobStoreFactory; |
21 | |
22 | /** @var BlobStore */ |
23 | private $blobStore; |
24 | |
25 | /** @var string|null */ |
26 | private $centralDB; |
27 | |
28 | /** |
29 | * @param VariablesManager $varManager |
30 | * @param BlobStoreFactory $blobStoreFactory |
31 | * @param BlobStore $blobStore |
32 | * @param string|null $centralDB |
33 | */ |
34 | public function __construct( |
35 | VariablesManager $varManager, |
36 | BlobStoreFactory $blobStoreFactory, |
37 | BlobStore $blobStore, |
38 | ?string $centralDB |
39 | ) { |
40 | $this->varManager = $varManager; |
41 | $this->blobStoreFactory = $blobStoreFactory; |
42 | $this->blobStore = $blobStore; |
43 | $this->centralDB = $centralDB; |
44 | } |
45 | |
46 | /** |
47 | * Store a var dump to a BlobStore. |
48 | * |
49 | * @param VariableHolder $varsHolder |
50 | * @param bool $global |
51 | * |
52 | * @return string Address of the record |
53 | */ |
54 | public function storeVarDump( VariableHolder $varsHolder, $global = false ) { |
55 | // Get all variables yet set and compute old and new wikitext if not yet done |
56 | // as those are needed for the diff view on top of the abuse log pages |
57 | $vars = $this->varManager->dumpAllVars( $varsHolder, [ 'old_wikitext', 'new_wikitext' ] ); |
58 | |
59 | // Vars is an array with native PHP data types (non-objects) now |
60 | $text = FormatJson::encode( $vars ); |
61 | |
62 | $dbDomain = $global ? $this->centralDB : false; |
63 | $blobStore = $this->blobStoreFactory->newBlobStore( $dbDomain ); |
64 | |
65 | $hints = [ |
66 | BlobStore::DESIGNATION_HINT => 'AbuseFilter', |
67 | BlobStore::MODEL_HINT => 'AbuseFilter', |
68 | ]; |
69 | return $blobStore->storeBlob( $text, $hints ); |
70 | } |
71 | |
72 | /** |
73 | * Retrieve a var dump from a BlobStore. |
74 | * |
75 | * @param string $address |
76 | * |
77 | * @return VariableHolder |
78 | */ |
79 | public function loadVarDump( string $address ): VariableHolder { |
80 | try { |
81 | $blob = $this->blobStore->getBlob( $address ); |
82 | } catch ( BlobAccessException $ex ) { |
83 | return new VariableHolder; |
84 | } |
85 | |
86 | $vars = FormatJson::decode( $blob, true ); |
87 | $obj = VariableHolder::newFromArray( $vars ); |
88 | $this->varManager->translateDeprecatedVars( $obj ); |
89 | return $obj; |
90 | } |
91 | } |