Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
VariablesBlobStore
100.00% covered (success)
100.00%
20 / 20
100.00% covered (success)
100.00%
3 / 3
5
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 storeVarDump
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
 loadVarDump
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace MediaWiki\Extension\AbuseFilter\Variables;
4
5use FormatJson;
6use MediaWiki\Storage\BlobAccessException;
7use MediaWiki\Storage\BlobStore;
8use MediaWiki\Storage\BlobStoreFactory;
9
10/**
11 * This service is used to store and load var dumps to a BlobStore
12 */
13class 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}