Store.php 18.5 KB
Newer Older
1
2
3
4
5
6
7
8
<?php
/**
 * Created by PhpStorm.
 * User: crose
 * Date: 1/1/16
 * Time: 6:51 PM
 */

9
namespace qfq;
10

11
use qfq\CodeException;
12
13
use qfq\keyValueStringParser;
use qfq\OnArray;
14
use qfq;
15

16
require_once(__DIR__ . '/../../qfq/helper/KeyValueStringParser.php');
Carsten  Rose's avatar
Carsten Rose committed
17
require_once(__DIR__ . '/../../qfq/helper/Sanitize.php');
18
require_once(__DIR__ . '/../../qfq/Constants.php');
19
require_once(__DIR__ . '/../../qfq/store/Sip.php');
20
require_once(__DIR__ . '/../../qfq/Database.php');
21
22
23
24
25
26
27
28
29
30
31


/*
 * Stores:
 * - SIP
 * - webVar
 * - record
 * - form
 * - formElement
 */

Carsten  Rose's avatar
Carsten Rose committed
32
33
/**
 * Class Store
34
 * @package qfq
Carsten  Rose's avatar
Carsten Rose committed
35
 */
36
37
class Store {

Carsten  Rose's avatar
Carsten Rose committed
38
39
40
    /**
     * @var Store Instance of class Store. There should only be one class 'Store' at a time.
     */
41
42
    private static $instance = null;

Carsten  Rose's avatar
Carsten Rose committed
43
44
45
    /**
     * @var Sip Instance of class SIP
     */
46
47
    private static $sip = null;

Carsten  Rose's avatar
Carsten Rose committed
48
49
50
51
52
53
54
55
56
57
    /**
     * @var array Stores all indiviudal stores with the variable raw values
     *
     * $raw['D']['id'] = 0  - Defaultvalues from Tabledefinition
     * ...
     * $raw['S']['r'] = 1234 - record ID from current SIP identifier
     * ...
     * $raw['C']['HTTP_SERVER'] = 'qfq' - Servername
     * $raw['C']['s'] = 'badcaffee1234' - recent SIP
     */
58
    private static $raw = array();
Carsten  Rose's avatar
Carsten Rose committed
59
60

    /**
Carsten  Rose's avatar
Carsten Rose committed
61
     * @var array Default sanitize classes.
Carsten  Rose's avatar
Carsten Rose committed
62
     */
Carsten  Rose's avatar
Carsten Rose committed
63
    private static $sanitizeClass = array();
Carsten  Rose's avatar
Carsten Rose committed
64
65

    /**
Carsten  Rose's avatar
Carsten Rose committed
66
67
     * $sanitizeClass['S'] = false
     * $sanitizeClass['C'] = true
Carsten  Rose's avatar
Carsten Rose committed
68
69
     * ...
     *
Carsten  Rose's avatar
Carsten Rose committed
70
     * @var array each entry with true/false - depending if store needs to be sanitized.
Carsten  Rose's avatar
Carsten Rose committed
71
     */
Carsten  Rose's avatar
Carsten Rose committed
72
    private static $sanitizeStore = array();
73

Carsten  Rose's avatar
Carsten Rose committed
74
    private static $phpUnit = false;
75

76
    /**
77
     * @param string $bodytext
78
     */
79
    private function __construct($bodytext = '') {
80

Carsten  Rose's avatar
Carsten Rose committed
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
        self::$sanitizeClass = [
//            TYPO3_DEBUG_LOAD => SANITIZE_ALLOW_DIGIT,
//            TYPO3_DEBUG_SAVE => SANITIZE_ALLOW_DIGIT,
//            TYPO3_FORM => SANITIZE_ALLOW_ALNUMX,
//            TYPO3_FE_USER => SANITIZE_ALLOW_ALNUMX,
//            TYPO3_FE_USER_UID => SANITIZE_ALLOW_DIGIT,
//            TYPO3_FE_USER_GROUP => SANITIZE_ALLOW_ALNUMX,

            CLIENT_SIP => SANITIZE_ALLOW_ALNUMX,
            CLIENT_RECORD_ID => SANITIZE_ALLOW_DIGIT,
            CLIENT_KEY_SEM_ID => SANITIZE_ALLOW_DIGIT,
            CLIENT_KEY_SEM_ID_USER => SANITIZE_ALLOW_DIGIT,
            CLIENT_PAGE_ID => SANITIZE_ALLOW_DIGIT,
            CLIENT_PAGE_TYPE => SANITIZE_ALLOW_DIGIT,
            CLIENT_PAGE_LANGUAGE => SANITIZE_ALLOW_DIGIT,
            CLIENT_FORM => SANITIZE_ALLOW_ALNUMX,

            // Part of $_SERVER. Missing vars must be requested individual with the needed sanitize class.
            CLIENT_SCRIPT_URL => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SCRIPT_URI => SANITIZE_ALLOW_ALNUMX,
            CLIENT_HTTP_HOST => SANITIZE_ALLOW_ALNUMX,
            CLIENT_HTTP_USER_AGENT => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SERVER_NAME => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SERVER_ADDRESS => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SERVER_PORT => SANITIZE_ALLOW_DIGIT,
            CLIENT_REMOTE_ADDRESS => SANITIZE_ALLOW_ALNUMX,
            CLIENT_REQUEST_SCHEME => SANITIZE_ALLOW_ALNUMX,
            CLIENT_SCRIPT_FILENAME => SANITIZE_ALLOW_ALNUMX,
            CLIENT_QUERY_STRING => SANITIZE_ALLOW_ALL,
            CLIENT_REQUEST_URI => SANITIZE_ALLOW_ALL,
            CLIENT_SCRIPT_NAME => SANITIZE_ALLOW_ALNUMX,
            CLIENT_PHP_SELF => SANITIZE_ALLOW_ALNUMX,
113
            CLIENT_UPLOAD_FILENAME => SANITIZE_ALLOW_ALLBUT,
Carsten  Rose's avatar
Carsten Rose committed
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

//            SYSTEM_DBUSER => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_DBSERVER => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_DBPW => SANITIZE_ALLOW_ALL,
//            SYSTEM_DB => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_TESTDB => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_SESSIONNAME => SANITIZE_ALLOW_ALNUMX,
//            SYSTEM_DBH => SANITIZE_ALLOW_ALL,

//            SYSTEM_SQL_RAW => SANITIZE_ALLOW_ALL,
//            SYSTEM_SQL_FINAL => SANITIZE_ALLOW_ALL,
//            SYSTEM_SQL_COUNT => SANITIZE_ALLOW_DIGIT,
//            SYSTEM_SQL_PARAM_ARRAY => SANITIZE_ALLOW_ALL,

//            SIP_SIP => SANITIZE_ALLOW_ALNUMX,
//            SIP_RECORD_ID => SANITIZE_ALLOW_DIGIT,
//            SIP_FORM => SANITIZE_ALLOW_ALNUMX,
//            SIP_URLPARAM => SANITIZE_ALLOW_ALL
132

133
134
        ];

Carsten  Rose's avatar
Carsten Rose committed
135
        self::$sanitizeStore = [
136
137
138
139
            STORE_FORM => true,
            STORE_SIP => false,
            STORE_RECORD => false,
            STORE_PARENT_RECORD => false,
140
141
            STORE_TABLE_DEFAULT => false,
            STORE_TABLE_COLUMN_TYPES => false,
142
143
            STORE_CLIENT => true,
            STORE_TYPO3 => false,
144
            STORE_ZERO => false,
145
            STORE_SYSTEM => false,
146
            STORE_EXTRA => false
147
148
        ];

149
        self::fillSystemStore();
150
        self::fillStoreTypo3($bodytext);
151
        self::fillStoreClient();
152
        self::fillStoreSip();
Carsten  Rose's avatar
Carsten Rose committed
153
        self::fillStoreExtra();
154
    }
155

156
157
    /**
     * @throws CodeException
158
     * @throws qfq\UserFormException
159
     */
160
    private static function fillSystemStore() {
161
        try {
162
163
            //TODO: Vernuenftige Fehlermeldung falls nicht auf qfq.ini zugegriffen werden kann.
            //TODO: sinnvollen Platz fuer qfq.ini bestimmen. In der Installationsdoku erwaehnen.
164
            $config = parse_ini_file(__DIR__ . '/../../../' . CONFIG_INI, false);
165

166
167
            //TODO: auskommentiert weil dann die Unittests nicht mehr laufen. Sollte eigentlich wieder aktiviert werden.
//            $config['SQLLOG'] = Support::ifRelativePathPrependExtensionPath($config['SQLLOG']);
168

169
        } catch (\Exception $e) {
170
            throw new qfq\UserFormException ("Error read file " . CONFIG_INI . ": " . $e->getMessage(), ERROR_IO_READ_FILE);
171
        }
172

173
        // Adjust config
174
        if (!isset($config['SHOW_DEBUG_INFO']) || $config['SHOW_DEBUG_INFO'] === 'auto') {
175
176
177
            $config['SHOW_DEBUG_INFO'] = (isset($GLOBALS["TSFE"]->beUserLogin) && $GLOBALS["TSFE"]->beUserLogin === true) ? 'yes' : 'no';
        }

178
179
180
181
182
183
184
        // SYSTEM_PATH_EXT: compute only if not already defined.
        if (!isset($config[SYSTEM_PATH_EXT]) || $config[SYSTEM_PATH_EXT] === '' || $config[SYSTEM_PATH_EXT][0] !== '/') {
            $relExtDir = '/typo3conf/ext/' . EXT_KEY;

            // If we are called through AJAX API (e.g. api/save.php), there is no TYPO3 environment.
            if (isset($_SERVER['SCRIPT_FILENAME'])) {
                $pos = strpos($_SERVER['SCRIPT_FILENAME'], $relExtDir);
185
186
                if ($pos === false && isset($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php'])) {

187
                    // Typo3 extension: probably index.php
188
                    $config[SYSTEM_PATH_EXT] = dirname($GLOBALS['TYPO3_LOADED_EXT'][EXT_KEY]['ext_localconf.php']);
189
                    $config[SYSTEM_SITE_PATH] = dirname($_SERVER['SCRIPT_FILENAME']);
190
                } else {
191
                    // API
192
                    $config[SYSTEM_PATH_EXT] = substr($_SERVER['SCRIPT_FILENAME'], 0, $pos + strlen($relExtDir));
193
                    $config[SYSTEM_SITE_PATH] = substr($_SERVER['SCRIPT_FILENAME'], 0, $pos);
194
195
196
197
                }
            }
        }

198
199
200
        // Defaults
        Support::setIfNotSet($config, SYSTEM_DATE_FORMAT, 'yyyy-mm-dd');

201
202
203
204
205
206
        // make SQL PATH absolute. This is necessary to work in different directories correctly.
        if (isset($config[SYSTEM_SQL_LOG]) && $config[SYSTEM_SQL_LOG][0] !== '/') {
            $config[SYSTEM_SQL_LOG] = $config[SYSTEM_PATH_EXT] . '/' . $config[SYSTEM_SQL_LOG];
        }


207
        self::setVarArray($config, STORE_SYSTEM, true);
208
209
    }

210
211
212
    /**
     * @param array $dataArray
     * @param $store
213
     * @param bool|false $flagOverwrite
214
     * @throws UserFormException
215
     * @throws \qfq\CodeException
216
     */
217
    public static function setVarArray(array $dataArray, $store, $flagOverwrite = false) {
Carsten  Rose's avatar
Carsten Rose committed
218
        // Check valid Storename
Carsten  Rose's avatar
Carsten Rose committed
219
        if (!isset(self::$sanitizeStore))
220
            throw new UserFormException("Unknown Store: $store", ERROR_UNNOWN_STORE);
Carsten  Rose's avatar
Carsten Rose committed
221
222


223
        if ($store === STORE_ZERO)
Carsten  Rose's avatar
Carsten Rose committed
224
            throw new CodeException("setVarArray() for STORE_ZERO is impossible - there are no values.", ERROR_SET_STORE_ZERO);
225

Carsten  Rose's avatar
Carsten Rose committed
226
        if (!$flagOverwrite && isset(self::$raw[$store]) && count(self::$raw[$store]) > 0) {
227
            throw new CodeException("Raw values already been copied to store '$store'. Do this only one time.", ERROR_STORE_VALUE_ALREADY_CODPIED);
228
        }
229

230
231
        self::$raw[$store] = $dataArray;
    }
232

233
234
235
236
    /**
     * @param $bodytext
     * @throws CodeException
     */
237
    private static function fillStoreTypo3($bodytext) {
238

239
        $arr = KeyValueStringParser::parse($bodytext, "=", "\n");
240
241
242
243
244
245
246
247
248

        if (isset($GLOBALS["TSFE"]->fe_user->user["username"]))
            $arr[TYPO3_FE_USER] = $GLOBALS["TSFE"]->fe_user->user["username"];

        if (isset($GLOBALS["TSFE"]->fe_user->user["uid"]))
            $arr[TYPO3_FE_USER_UID] = $GLOBALS["TSFE"]->fe_user->user["uid"];

        if (isset($GLOBALS["TSFE"]->fe_user->user["usergroup"]))
            $arr[TYPO3_FE_USER_GROUP] = $GLOBALS["TSFE"]->fe_user->user["usergroup"];
249

Carsten  Rose's avatar
Carsten Rose committed
250
251
252
        if (isset($GLOBALS["TSFE"]->page["uid"]))
            $arr[TYPO3_TT_CONTENT_UID] = $GLOBALS["TSFE"]->page["uid"];

253
254
255
        if (isset($GLOBALS["TSFE"]->id))
            $arr[TYPO3_PAGE_ID] = $GLOBALS["TSFE"]->id;

Carsten  Rose's avatar
Carsten Rose committed
256
257
258
        if (isset($GLOBALS["TSFE"]->type))
            $arr[TYPO3_PAGE_TYPE] = $GLOBALS["TSFE"]->type;

259
260
261
        if (isset($GLOBALS["TSFE"]->sys_language_uid))
            $arr[TYPO3_PAGE_LANGUAGE] = $GLOBALS["TSFE"]->sys_language_uid;

262
        self::setVarArray($arr, STORE_TYPO3, true);
263
    }
264

265
266
267
    /**
     * @throws CodeException
     */
268
    private static function fillStoreClient() {
269
        // copy GET and POST and SERVER Parameter. Priority: SERVER, POST, GET
270
271
272
273
274
275
276
277
278
        $arr = array();
        if (isset($_GET))
            $arr = array_merge($arr, $_GET);

        if (isset($_POST))
            $arr = array_merge($arr, $_POST);

        if (isset($_SERVER))
            $arr = array_merge($arr, $_SERVER);
279

280
        self::setVarArray($arr, STORE_CLIENT, true);
281
    }
282

Carsten  Rose's avatar
Carsten Rose committed
283
284
    /**
     * @throws CodeException
285
     * @throws UserFormException
Carsten  Rose's avatar
Carsten Rose committed
286
     */
287
    private static function fillStoreSip() {
Carsten  Rose's avatar
Carsten Rose committed
288

289
        $sessionName = self::getVar(SYSTEM_SESSION_NAME, STORE_SYSTEM);
290
        self::$sip = new Sip($sessionName);
291

292
293
294
295
        $s = self::getVar(CLIENT_SIP, STORE_CLIENT);
        if ($s !== false) {
            // if session is given, copy values to store
            $param = self::$sip->getVarsFromSip($s);
296
297
            $param[SIP_SIP] = $s;
            $param[SIP_URLPARAM] = self::$sip->getQueryStringFromSip($s);
298

299
//            self::setVarArray(KeyValueStringParser::parse($param, "=", "&"), STORE_SIP);
300
            self::setVarArray($param, STORE_SIP, true);
301
302
303
        }
    }

304
    /**
305
     * Cycles through all stores in $useStore.
306
     * First match will return the found value.
Carsten  Rose's avatar
Carsten Rose committed
307
     * During cycling: fill cache with requestet value and sanitize raw value.
308
     *
309
     * @param string $key
310
     * @param string $useStores f.e.: 'FSRD'
Carsten  Rose's avatar
Carsten Rose committed
311
     * @param string $sanitizeClass
Carsten  Rose's avatar
Carsten Rose committed
312
     * @param string $foundInStore Returns the name of the store where $key has been found. If $key is not found, return ''.
313
     * @return string a) if found: value, b) false
Carsten  Rose's avatar
Carsten Rose committed
314
     * @throws \qfq\CodeException
315
     */
Carsten  Rose's avatar
Carsten Rose committed
316
    public static function getVar($key, $useStores = STORE_USE_DEFAULT, $sanitizeClass = '', &$foundInStore = '') {
317
318

        // no store specifed?
319
        if ($useStores === "" || $useStores === null) {
320
            $useStores = STORE_USE_DEFAULT;
321
322
        }

323
        // no sanitizeClass specified: take predefined (if exist) or default.
324
        if ($sanitizeClass === '' || $sanitizeClass === null) {
Carsten  Rose's avatar
Carsten Rose committed
325
            $sanitizeClass = isset(self::$sanitizeClass[$key]) ? self::$sanitizeClass[$key] : SANITIZE_DEFAULT;
326
327
        }

328
329
330
        while ($useStores !== false) {

            $store = substr($useStores, 0, 1); // next store
Carsten  Rose's avatar
Carsten Rose committed
331
            $foundInStore = $store;
332
333
            $useStores = substr($useStores, 1); // shift left remaining stores

334
            if (!isset(self::$raw[$store][$key])) {
335
336
337
                switch ($store) {
                    case STORE_ZERO:
                        return 0;
338
339
                    case STORE_EMPTY:
                        return '';
340
341
                    case STORE_VAR:
                        if ($key === VAR_RANDOM) {
342
                            return Support::randomAlphaNum(RANDOM_LENGTH);
343
344
345
346
347
348
349
                        } else {
                            continue 2;  // no value provided, continue with while loop
                        }
                        break;
                    default:
                        continue 2; // no value provided, continue with while loop
                        break;
Carsten  Rose's avatar
Carsten Rose committed
350
                }
351
352
            }

353
            $rawVal = isset(self::$raw[$store][$key]) ? self::$raw[$store][$key] : null;
Carsten  Rose's avatar
Carsten Rose committed
354
            if (self::$sanitizeStore[$store] && $sanitizeClass != '') {
355
356
357
358
359
                if ($sanitizeClass == SANITIZE_ALLOW_PATTERN || $sanitizeClass == SANITIZE_ALLOW_MIN_MAX || $sanitizeClass == SANITIZE_ALLOW_MIN_MAX_DATE) {
                    // We do not have any pattern or min|max values at this point. For those who be affected, they already checked earlier. So set 'no check'
                    $sanitizeClass = SANITIZE_ALLOW_ALL;
                }
                return \qfq\Sanitize::sanitize($rawVal, $sanitizeClass, '', SANATIZE_EMPTY_STRING);
360
361
            } else {
                return $rawVal;
362
            }
363
        }
Carsten  Rose's avatar
Carsten Rose committed
364
        $foundInStore = '';
365
        return false;
366
    }
367

Carsten  Rose's avatar
Carsten Rose committed
368
369
370
371
372
    /**
     * @throws UserFormException
     * @throws \qfq\CodeException
     */
    private static function fillStoreExtra() {
373

Carsten  Rose's avatar
Carsten Rose committed
374
375
376
377
378
379
        if (isset($_SESSION[STORE_EXTRA]))
            self::setVarArray($_SESSION[STORE_EXTRA], STORE_EXTRA, true);
        else
            self::setVarArray(array(), STORE_EXTRA, true);
    }

380
381
    /**
     * @param string $bodytext
382
     * @param bool|false $phpUnit
383
     * @return null|\qfq\Store
384
     */
385
    public static function getInstance($bodytext = '', $phpUnit = false) {
386

387
        if ($phpUnit) {
388
389
390
391
392
393
394
            if (self::$instance !== null) {

                self::unsetStore(STORE_TYPO3);
                self::fillStoreTypo3($bodytext);

                self::unsetStore(STORE_CLIENT);
                self::fillStoreClient();
395
396
397
398
399
            }
        }

        // Design Pattern: Singleton
        if (self::$instance === null) {
400
401
402
            self::$phpUnit = $phpUnit;

            self::$instance = new self($bodytext);
Carsten  Rose's avatar
Carsten Rose committed
403
404
405
406
        } else {
            // Class Store seems to be presistent over multiple QFQ instantiation. Set bodytext again, with every new request (if bodytext is given).
            if ($bodytext !== '')
                self::fillStoreTypo3($bodytext);
407
408
        }

409
410
411
412
413
414
415
        // Disable TYPO3_DEBUG_SHOW_BODY_TEXT=1 if SYSTEM_SHOW_DEBUG_INFO!='yes'
        if (self::getVar(TYPO3_DEBUG_SHOW_BODY_TEXT, STORE_TYPO3) === '1' &&
            self::getVar(SYSTEM_SHOW_DEBUG_INFO, STORE_SYSTEM) !== 'yes'
        ) {
            self::setVar(TYPO3_DEBUG_SHOW_BODY_TEXT, '0', STORE_TYPO3);
        }

416
        return self::$instance;
417
    }
418

419
420
    /**
     * @param $store
421
422
     * @throws UserFormException
     * @throws \qfq\CodeException
423
424
     */
    public static function unsetStore($store) {
Carsten  Rose's avatar
Carsten Rose committed
425
        // Check valid Storename
Carsten  Rose's avatar
Carsten Rose committed
426
        if (!isset(self::$sanitizeStore))
427
            throw new UserFormException("Unknown Store: $store", ERROR_UNNOWN_STORE);
Carsten  Rose's avatar
Carsten Rose committed
428

429
        if ($store === STORE_ZERO)
Carsten  Rose's avatar
Carsten Rose committed
430
431
            throw new CodeException("unsetStore() for STORE_ZERO is impossible - there are no values.", ERROR_SET_STORE_ZERO);

432
433
434
        if (isset(self::$raw[$store])) {
            self::$raw[$store] = array();
        }
Carsten  Rose's avatar
Carsten Rose committed
435

436
437
    }

438
    /**
Carsten  Rose's avatar
Carsten Rose committed
439
440
441
     * @param string $key
     * @param string|array $value
     * @param string $store
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
     * @param bool|true $overWrite
     * @throws UserFormException
     * @throws \qfq\CodeException
     */
    public static function setVar($key, $value, $store, $overWrite = true) {
        // Check valid Storename
        if (!isset(self::$sanitizeStore))
            throw new UserFormException("Unknown Store: $store", ERROR_UNNOWN_STORE);

        if ($store === STORE_ZERO)
            throw new CodeException("setVar() for STORE_ZERO is impossible - there are no values.", ERROR_SET_STORE_ZERO);

        if ($overWrite === false && isset(self::$raw[$store][$key])) {
            throw new UserFormException("Value of '$key' already be set in store '$store'.", ERROR_STORE_KEY_EXIST);
        }

        self::$raw[$store][$key] = $value;
Carsten  Rose's avatar
Carsten Rose committed
459
460
461

        // The STORE_EXTRA saves arrays and is persistent
        if ($store === STORE_EXTRA) {
462
463

            $_SESSION[STORE_EXTRA][$key] = $value;
Carsten  Rose's avatar
Carsten Rose committed
464
465
        }

466
467
    }

468
469
470
471
    /**
     * @param $formName
     * @throws CodeException
     */
472
    public static function createSipAfterFormLoad($formName) {
473
        $recordId = self::getVar(CLIENT_RECORD_ID, STORE_TYPO3 . STORE_CLIENT);
474
475
476
477
478
479
480
        if ($recordId === false) {
            $recordId = 0;
        }

        $tmpParam = [SIP_RECORD_ID => $recordId, SIP_FORM => $formName];

        // Construct fake urlparam
481
        $tmpUrlparam = OnArray::toString($tmpParam);
482
483

        // Create a fake SIP which has never been passed by URL - further processing might expect this to exist.
484
        $sip = self::getSipInstance()->queryStringToSip($tmpUrlparam, RETURN_SIP);
485
        self::setVar(CLIENT_SIP, $sip, STORE_CLIENT);
486
487
488
489
490

        // Store in SIP Store (cause it's empty until now).
        $tmpParam[SIP_SIP] = $sip;
        self::setVarArray($tmpParam, STORE_SIP);

491
492
493
    }

    /**
494
     * @return null|Sip
495
     */
496
    public static function getSipInstance() {
497
498
        return self::$sip;
    }
499

500
501
    /**
     * @param $store
502
503
504
     * @return array
     * @throws UserFormException
     * @throws \qfq\CodeException
505
506
     */
    public static function getStore($store) {
Carsten  Rose's avatar
Carsten Rose committed
507
        // Check valid Storename
Carsten  Rose's avatar
Carsten Rose committed
508
        if (!isset(self::$sanitizeStore[$store]))
509
            throw new UserFormException("Unknown Store: $store", ERROR_UNNOWN_STORE);
Carsten  Rose's avatar
Carsten Rose committed
510

511
        if ($store === STORE_ZERO)
Carsten  Rose's avatar
Carsten Rose committed
512
513
            throw new CodeException("getStore() for STORE_ZERO is impossible - there are no values saved.", ERROR_GET_STORE_ZERO);

514
515
516
517
518
        if (isset(self::$raw[$store])) {
            return self::$raw[$store];
        }
        return array();
    }
519

Carsten  Rose's avatar
Carsten Rose committed
520

521
    /**
Carsten  Rose's avatar
Carsten Rose committed
522
523
     * Fills STORE_TABLE_DEFAULT and STORE_TABLE_COLUMN_TYPES
     *
524
525
526
     * @param $tableName
     * @throws CodeException
     */
527
    public static function fillStoreTableDefaultColumnType($tableName) {
528
529
530
531
        $db = new qfq\Database();

        $tableDefinition = $db->getTableDefinition($tableName);

Carsten  Rose's avatar
Carsten Rose committed
532
533
        self::setVarArray(array_column($tableDefinition, 'Default', 'Field'), STORE_TABLE_DEFAULT, true);
        self::setVarArray(array_column($tableDefinition, 'Type', 'Field'), STORE_TABLE_COLUMN_TYPES, true);
534
    }
535
536
537
538
539
}