Completed
Push — develop ( 4f7877...1baf28 )
by Dmytro
05:50
created

instprocessor.php ➔ propUpdate()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 10
nc 6
nop 2
dl 0
loc 13
rs 9.2
c 0
b 0
f 0
1
<?php
2 View Code Duplication
if (file_exists(dirname(__FILE__)."/../assets/cache/siteManager.php")) {
3
    include_once(dirname(__FILE__)."/../assets/cache/siteManager.php");
4
}else{
5
    define('MGR_DIR', 'manager');
6
}
7
8
global $moduleName;
9
global $moduleVersion;
10
global $moduleSQLBaseFile;
11
global $moduleSQLDataFile;
12
global $moduleSQLResetFile;
13
14
global $moduleChunks;
15
global $moduleTemplates;
16
global $moduleSnippets;
17
global $modulePlugins;
18
global $moduleModules;
19
global $moduleTVs;
20
global $moduleDependencies;
21
22
global $errors;
23
24
$create = false;
25
26
// set timout limit
27
@ set_time_limit(120); // used @ to prevent warning when using safe mode?
28
29
echo "<p>{$_lang['setup_database']}</p>\n";
30
31
$installMode= (int)$_POST['installmode'];
32
$installData = $_POST['installdata'] == "1" ? 1 : 0;
33
34
//if ($installMode == 1) {
35
//	include "../".MGR_DIR."/includes/config.inc.php";
36
//} else {
37
// get db info from post
38
$database_server = $_POST['databasehost'];
39
$database_user = $_SESSION['databaseloginname'];
40
$database_password = $_SESSION['databaseloginpassword'];
41
$database_collation = $_POST['database_collation'];
42
$database_charset = substr($database_collation, 0, strpos($database_collation, '_'));
43
$database_connection_charset = $_POST['database_connection_charset'];
44
$database_connection_method = $_POST['database_connection_method'];
45
$dbase = "`" . $_POST['database_name'] . "`";
46
$table_prefix = $_POST['tableprefix'];
47
$adminname = $_POST['cmsadmin'];
48
$adminemail = $_POST['cmsadminemail'];
49
$adminpass = $_POST['cmspassword'];
50
$managerlanguage = $_POST['managerlanguage'];
51
$custom_placeholders = array();
52
//}
53
54
// set session name variable
55
if (!isset ($site_sessionname)) {
56
    $site_sessionname = 'SN' . uniqid('');
57
}
58
59
// get base path and url
60
$a = explode("install", str_replace("\\", "/", dirname($_SERVER["PHP_SELF"])));
61
if (count($a) > 1)
62
    array_pop($a);
63
$url = implode("install", $a);
64
reset($a);
65
$a = explode("install", str_replace("\\", "/", realpath(dirname(__FILE__))));
66
if (count($a) > 1)
67
    array_pop($a);
68
$pth = implode("install", $a);
69
unset ($a);
70
$base_url = $url . (substr($url, -1) != "/" ? "/" : "");
71
$base_path = $pth . (substr($pth, -1) != "/" ? "/" : "");
72
73
// connect to the database
74
echo "<p>". $_lang['setup_database_create_connection'];
75
if (!$conn = mysqli_connect($database_server, $database_user, $database_password)) {
76
    echo '<span class="notok">'.$_lang["setup_database_create_connection_failed"]."</span></p><p>".$_lang['setup_database_create_connection_failed_note']."</p>";
77
    return;
78
} else {
79
    echo '<span class="ok">'.$_lang['ok']."</span></p>";
80
}
81
82
// select database
83
echo "<p>".$_lang['setup_database_selection']. str_replace("`", "", $dbase) . "`: ";
84
if (!mysqli_select_db($conn, str_replace("`", "", $dbase))) {
85
    echo "<span class=\"notok\" style='color:#707070'>".$_lang['setup_database_selection_failed']."</span>".$_lang['setup_database_selection_failed_note']."</p>";
86
    $create = true;
87 View Code Duplication
} else {
88
	if (function_exists('mysqli_set_charset')) mysqli_set_charset($conn, $database_charset);
89
    mysqli_query($conn, "{$database_connection_method} {$database_connection_charset}");
90
    echo '<span class="ok">'.$_lang['ok']."</span></p>";
91
}
92
93
// try to create the database
94
if ($create) {
95
    echo "<p>".$_lang['setup_database_creation']. str_replace("`", "", $dbase) . "`: ";
96
    //	if(!@mysqli_create_db(str_replace("`","",$dbase), $conn)) {
97
    if (! mysqli_query($conn, "CREATE DATABASE $dbase DEFAULT CHARACTER SET $database_charset COLLATE $database_collation")) {
98
        echo '<span class="notok">'.$_lang['setup_database_creation_failed']."</span>".$_lang['setup_database_creation_failed_note']."</p>";
99
        $errors += 1;
100
?>
101
        <pre>
102
        database charset = <?php echo $database_charset ?>
103
        database collation = <?php echo $database_collation ?>
104
        </pre>
105
        <p><?php echo $_lang['setup_database_creation_failed_note2']?></p>
106
<?php
107
108
        return;
109
    } else {
110
        echo '<span class="ok">'.$_lang['ok']."</span></p>";
111
    }
112
}
113
114
// check table prefix
115
if ($installMode == 0) {
116
    echo "<p>" . $_lang['checking_table_prefix'] . $table_prefix . "`: ";
117 View Code Duplication
    if (@ $rs = mysqli_query($conn, "SELECT COUNT(*) FROM $dbase.`" . $table_prefix . "site_content`")) {
118
        echo '<span class="notok">' . $_lang['failed'] . "</span>" . $_lang['table_prefix_already_inuse'] . "</p>";
119
        $errors += 1;
120
        echo "<p>" . $_lang['table_prefix_already_inuse_note'] . "</p>";
121
        return;
122
    } else {
123
        echo '<span class="ok">'.$_lang['ok']."</span></p>";
124
    }
125
}
126
127 View Code Duplication
if(!function_exists('parseProperties')) {
128
    /**
129
     * parses a resource property string and returns the result as an array
130
     * duplicate of method in documentParser class
131
     *
132
     * @param string $propertyString
133
     * @return array
0 ignored issues
show
Documentation introduced by
Should the return type not be string?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
134
     */
135
    function parseProperties($propertyString) {
0 ignored issues
show
Best Practice introduced by
The function parseProperties() has been defined more than once; this definition is ignored, only the first definition in install/cli-install.php (L498-516) is considered.

This check looks for functions that have already been defined in other files.

Some Codebases, like WordPress, make a practice of defining functions multiple times. This may lead to problems with the detection of function parameters and types. If you really need to do this, you can mark the duplicate definition with the @ignore annotation.

/**
 * @ignore
 */
function getUser() {

}

function getUser($id, $realm) {

}

See also the PhpDoc documentation for @ignore.

Loading history...
136
        $parameter= array ();
137
        if (!empty ($propertyString)) {
138
            $tmpParams= explode("&", $propertyString);
139
            $countParams = count($tmpParams);
140
            for ($x= 0; $x < $countParams; $x++) {
141
                if (strpos($tmpParams[$x], '=', 0)) {
142
                    $pTmp= explode("=", $tmpParams[$x]);
143
                    $pvTmp= explode(";", trim($pTmp[1]));
144
                    if ($pvTmp[1] == 'list' && $pvTmp[3] != "")
145
                        $parameter[trim($pTmp[0])]= $pvTmp[3]; //list default
146
                    else
147
                        if ($pvTmp[1] != 'list' && $pvTmp[2] != "")
148
                            $parameter[trim($pTmp[0])]= $pvTmp[2];
149
                }
150
            }
151
        }
152
        return $parameter;
153
    }
154
}
155
156
// check status of Inherit Parent Template plugin
157
$auto_template_logic = 'parent';
158 View Code Duplication
if ($installMode != 0) {
159
    $rs = mysqli_query($conn, "SELECT properties, disabled FROM $dbase.`" . $table_prefix . "site_plugins` WHERE name='Inherit Parent Template'");
160
    $row = mysqli_fetch_row($rs);
161
    if(!$row) {
162
        // not installed
163
        $auto_template_logic = 'system';
164
    } else {
165
        if($row[1] == 1) {
166
            // installed but disabled
167
            $auto_template_logic = 'system';
168
        } else {
169
            // installed, enabled .. see how it's configured
170
            $properties = parseProperties($row[0]);
171
            if(isset($properties['inheritTemplate'])) {
172
                if($properties['inheritTemplate'] == 'From First Sibling') {
173
                    $auto_template_logic = 'sibling';
174
                }
175
            }
176
        }
177
    }
178
}
179
180
// open db connection
181
$setupPath = realpath(dirname(__FILE__));
182
include "{$setupPath}/setup.info.php";
183
include "{$setupPath}/sqlParser.class.php";
184
$sqlParser = new SqlParser($database_server, $database_user, $database_password, str_replace("`", "", $dbase), $table_prefix, $adminname, $adminemail, $adminpass, $database_connection_charset, $managerlanguage, $database_connection_method, $auto_template_logic);
185
$sqlParser->mode = ($installMode < 1) ? "new" : "upd";
186
/* image and file manager paths now handled via settings screen in Manager
187
$sqlParser->imageUrl = 'http://' . $_SERVER['SERVER_NAME'] . $base_url . "assets/";
188
$sqlParser->imageUrl = "assets/";
189
$sqlParser->imagePath = $base_path . "assets/";
190
$sqlParser->fileManagerPath = $base_path;
191
*/
192
$sqlParser->ignoreDuplicateErrors = true;
193
$sqlParser->connect();
194
195
// install/update database
196
echo "<p>" . $_lang['setup_database_creating_tables'];
197
if ($moduleSQLBaseFile) {
198
    $sqlParser->process($moduleSQLBaseFile);
199
    // display database results
200 View Code Duplication
    if ($sqlParser->installFailed == true) {
201
        $errors += 1;
202
        echo "<span class=\"notok\"><b>" . $_lang['database_alerts'] . "</span></p>";
203
        echo "<p>" . $_lang['setup_couldnt_install'] . "</p>";
204
        echo "<p>" . $_lang['installation_error_occured'] . "<br /><br />";
205
        for ($i = 0; $i < count($sqlParser->mysqlErrors); $i++) {
206
            echo "<em>" . $sqlParser->mysqlErrors[$i]["error"] . "</em>" . $_lang['during_execution_of_sql'] . "<span class='mono'>" . strip_tags($sqlParser->mysqlErrors[$i]["sql"]) . "</span>.<hr />";
207
        }
208
        echo "</p>";
209
        echo "<p>" . $_lang['some_tables_not_updated'] . "</p>";
210
        return;
211
    } else {
212
        echo '<span class="ok">'.$_lang['ok']."</span></p>";
213
    }
214
}
215
216
// custom or not
217
if (file_exists(dirname(__FILE__)."/../../assets/cache/siteManager.php")) {
218
    $mgrdir = 'include_once(dirname(__FILE__)."/../../assets/cache/siteManager.php");';
219
}else{
220
    $mgrdir = 'define(\'MGR_DIR\', \'manager\');';
221
}
222
223
// write the config.inc.php file if new installation
224
echo "<p>" . $_lang['writing_config_file'];
225
226
$confph = array();
227
$confph['database_server']    = $database_server;
228
$confph['user_name']          = mysqli_real_escape_string($conn, $database_user);
229
$confph['password']           = mysqli_real_escape_string($conn, $database_password);
230
$confph['connection_charset'] = $database_connection_charset;
231
$confph['connection_method']  = $database_connection_method;
232
$confph['dbase']              = str_replace('`', '', $dbase);
233
$confph['table_prefix']       = $table_prefix;
234
$confph['lastInstallTime']    = time();
235
$confph['site_sessionname']   = $site_sessionname;
236
237
$configString = file_get_contents('config.inc.tpl');
238
$configString = parse($configString, $confph);
239
240
$filename = '../'.MGR_DIR.'/includes/config.inc.php';
241
$configFileFailed = false;
242
if (@ !$handle = fopen($filename, 'w')) {
243
    $configFileFailed = true;
244
}
245
246
// write $somecontent to our opened file.
247
if (@ fwrite($handle, $configString) === FALSE) {
248
    $configFileFailed = true;
249
}
250
@ fclose($handle);
251
252
// try to chmod the config file go-rwx (for suexeced php)
253
$chmodSuccess = @chmod($filename, 0404);
254
255
if ($configFileFailed == true) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
256
    echo '<span class="notok">' . $_lang['failed'] . "</span></p>";
257
    $errors += 1;
258
?>
259
    <p><?php echo $_lang['cant_write_config_file']?><span class="mono"><?php echo MGR_DIR; ?>/includes/config.inc.php</span></p>
260
    <textarea style="width:400px; height:160px;">
261
    <?php echo $configString; ?>
262
    </textarea>
263
    <p><?php echo $_lang['cant_write_config_file_note']?></p>
264
<?php
265
    return;
266
} else {
267
    echo '<span class="ok">'.$_lang['ok']."</span></p>";
268
}
269
270
// generate new site_id and set manager theme to default
271 View Code Duplication
if ($installMode == 0) {
272
    $siteid = uniqid('');
273
    mysqli_query($sqlParser->conn, "REPLACE INTO $dbase.`" . $table_prefix . "system_settings` (setting_name,setting_value) VALUES('site_id','$siteid'),('manager_theme','default')");
274
} else {
275
    // update site_id if missing
276
    $ds = mysqli_query($sqlParser->conn, "SELECT setting_name,setting_value FROM $dbase.`" . $table_prefix . "system_settings` WHERE setting_name='site_id'");
277
    if ($ds) {
278
        $r = mysqli_fetch_assoc($ds);
279
        $siteid = $r['setting_value'];
280
        if ($siteid == '' || $siteid = 'MzGeQ2faT4Dw06+U49x3') {
281
            $siteid = uniqid('');
282
            mysqli_query($sqlParser->conn, "REPLACE INTO $dbase.`" . $table_prefix . "system_settings` (setting_name,setting_value) VALUES('site_id','$siteid')");
283
        }
284
    }
285
}
286
287
// Reset database for installation of demo-site
288
if ($installData && $moduleSQLDataFile && $moduleSQLResetFile) {
289
	echo "<p>" . $_lang['resetting_database'];
290
	$sqlParser->process($moduleSQLResetFile);
291
	// display database results
292 View Code Duplication
	if ($sqlParser->installFailed == true) {
293
		$errors += 1;
294
		echo "<span class=\"notok\"><b>" . $_lang['database_alerts'] . "</span></p>";
295
		echo "<p>" . $_lang['setup_couldnt_install'] . "</p>";
296
		echo "<p>" . $_lang['installation_error_occured'] . "<br /><br />";
297
		for ($i = 0; $i < count($sqlParser->mysqlErrors); $i++) {
298
			echo "<em>" . $sqlParser->mysqlErrors[$i]["error"] . "</em>" . $_lang['during_execution_of_sql'] . "<span class='mono'>" . strip_tags($sqlParser->mysqlErrors[$i]["sql"]) . "</span>.<hr />";
299
		}
300
		echo "</p>";
301
		echo "<p>" . $_lang['some_tables_not_updated'] . "</p>";
302
		return;
303
	} else {
304
		echo '<span class="ok">'.$_lang['ok']."</span></p>";
305
	}
306
}
307
308
// Install Templates
309
if (isset ($_POST['template']) || $installData) {
310
    echo "<h3>" . $_lang['templates'] . ":</h3> ";
311
    $selTemplates = $_POST['template'];
312
    foreach ($moduleTemplates as $k=>$moduleTemplate) {
313
        $installSample = in_array('sample', $moduleTemplate[6]) && $installData == 1;
314
        if($installSample || in_array($k, $selTemplates)) {
315
            $name = mysqli_real_escape_string($conn, $moduleTemplate[0]);
316
            $desc = mysqli_real_escape_string($conn, $moduleTemplate[1]);
317
            $category = mysqli_real_escape_string($conn, $moduleTemplate[4]);
318
            $locked = mysqli_real_escape_string($conn, $moduleTemplate[5]);
319
            $filecontent = $moduleTemplate[3];
320
            $save_sql_id_as = $moduleTemplate[7]; // Nessecary for demo-site
321
            if (!file_exists($filecontent)) {
322
                echo "<p>&nbsp;&nbsp;$name: <span class=\"notok\">" . $_lang['unable_install_template'] . " '$filecontent' " . $_lang['not_found'] . ".</span></p>";
323
            } else {
324
                // Create the category if it does not already exist
325
                $category_id = getCreateDbCategory($category, $sqlParser);
326
327
                // Strip the first comment up top
328
                $template = preg_replace("/^.*?\/\*\*.*?\*\/\s+/s", '', file_get_contents($filecontent), 1);
329
                $template = mysqli_real_escape_string($conn, $template);
330
331
                // See if the template already exists
332
                $rs = mysqli_query($sqlParser->conn, "SELECT * FROM $dbase.`" . $table_prefix . "site_templates` WHERE templatename='$name'");
333
334
                if (mysqli_num_rows($rs)) {
335
                    if (!mysqli_query($sqlParser->conn, "UPDATE $dbase.`" . $table_prefix . "site_templates` SET content='$template', description='$desc', category=$category_id, locked='$locked'  WHERE templatename='$name' LIMIT 1;")) {
336
                        $errors += 1;
337
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
338
                        return;
339
                    }
340 View Code Duplication
                    if(!is_null($save_sql_id_as)) {
341
                        $sql_id = @mysqli_insert_id($sqlParser->conn);
342
                        if(!$sql_id) {
343
                            $idQuery = mysqli_fetch_assoc(mysqli_query($sqlParser->conn, "SELECT id FROM $dbase.`" . $table_prefix . "site_templates` WHERE templatename='$name' LIMIT 1;"));
344
                            $sql_id = $idQuery['id'];
345
                        }
346
                        $custom_placeholders[$save_sql_id_as] = $sql_id;
347
                    }
348
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['upgraded'] . "</span></p>";
349
                } else {
350
                    if (!@ mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`" . $table_prefix . "site_templates` (templatename,description,content,category,locked) VALUES('$name','$desc','$template',$category_id,'$locked');")) {
351
                        $errors += 1;
352
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
353
                        return;
354
                    }
355
                    if(!is_null($save_sql_id_as)) $custom_placeholders[$save_sql_id_as] = @mysqli_insert_id($sqlParser->conn);
356
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['installed'] . "</span></p>";
357
                }
358
            }
359
        }
360
    }
361
}
362
363
// Install Template Variables
364
if (isset ($_POST['tv']) || $installData) {
365
    echo "<h3>" . $_lang['tvs'] . ":</h3> ";
366
    $selTVs = $_POST['tv'];
367
    foreach ($moduleTVs as $k=>$moduleTV) {
368
        $installSample = in_array('sample', $moduleTV[12]) && $installData == 1;
369
        if($installSample || in_array($k, $selTVs)) {
370
            $name = mysqli_real_escape_string($conn, $moduleTV[0]);
371
            $caption = mysqli_real_escape_string($conn, $moduleTV[1]);
372
            $desc = mysqli_real_escape_string($conn, $moduleTV[2]);
373
            $input_type = mysqli_real_escape_string($conn, $moduleTV[3]);
374
            $input_options = mysqli_real_escape_string($conn, $moduleTV[4]);
375
            $input_default = mysqli_real_escape_string($conn, $moduleTV[5]);
376
            $output_widget = mysqli_real_escape_string($conn, $moduleTV[6]);
377
            $output_widget_params = mysqli_real_escape_string($conn, $moduleTV[7]);
378
            $filecontent = $moduleTV[8];
379
            $assignments = $moduleTV[9];
380
            $category = mysqli_real_escape_string($conn, $moduleTV[10]);
381
            $locked = mysqli_real_escape_string($conn, $moduleTV[11]);
382
383
384
            // Create the category if it does not already exist
385
            $category = getCreateDbCategory($category, $sqlParser);
386
387
            $rs = mysqli_query($sqlParser->conn, "SELECT * FROM $dbase.`" . $table_prefix . "site_tmplvars` WHERE name='$name'");
388
            if (mysqli_num_rows($rs)) {
389
                $insert = true;
390 View Code Duplication
                while($row = mysqli_fetch_assoc($rs)) {
391
                    if (!mysqli_query($sqlParser->conn, "UPDATE $dbase.`" . $table_prefix . "site_tmplvars` SET type='$input_type', caption='$caption', description='$desc', category=$category, locked=$locked, elements='$input_options', display='$output_widget', display_params='$output_widget_params', default_text='$input_default' WHERE id={$row['id']};")) {
392
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
393
                        return;
394
                    }
395
                    $insert = false;
396
                }
397
                echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['upgraded'] . "</span></p>";
398
            } else {
399
                //$q = "INSERT INTO $dbase.`" . $table_prefix . "site_tmplvars` (type,name,caption,description,category,locked,elements,display,display_params,default_text) VALUES('$input_type','$name','$caption','$desc',(SELECT (CASE COUNT(*) WHEN 0 THEN 0 ELSE `id` END) `id` FROM $dbase.`" . $table_prefix . "categories` WHERE `category` = '$category'),$locked,'$input_options','$output_widget','$output_widget_params','$input_default');";
400
                $q = "INSERT INTO $dbase.`" . $table_prefix . "site_tmplvars` (type,name,caption,description,category,locked,elements,display,display_params,default_text) VALUES('$input_type','$name','$caption','$desc',$category,$locked,'$input_options','$output_widget','$output_widget_params','$input_default');";
401 View Code Duplication
                if (!mysqli_query($sqlParser->conn, $q)) {
402
                    echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
403
                    return;
404
                }
405
                echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['installed'] . "</span></p>";
406
            }
407
408
            // add template assignments
409
            $assignments = explode(',', $assignments);
410
411 View Code Duplication
            if (count($assignments) > 0) {
412
413
                // remove existing tv -> template assignments
414
                $ds=mysqli_query($sqlParser->conn, "SELECT id FROM $dbase.`".$table_prefix."site_tmplvars` WHERE name='$name' AND description='$desc';");
415
                $row = mysqli_fetch_assoc($ds);
416
                $id = $row["id"];
417
                mysqli_query($sqlParser->conn, 'DELETE FROM ' . $dbase . '.`' . $table_prefix . 'site_tmplvar_templates` WHERE tmplvarid = \'' . $id . '\'');
418
419
                // add tv -> template assignments
420
                foreach ($assignments as $assignment) {
421
                    $template = mysqli_real_escape_string($conn, $assignment);
422
                    $ts = mysqli_query($sqlParser->conn, "SELECT id FROM $dbase.`".$table_prefix."site_templates` WHERE templatename='$template';");
423
                    if ($ds && $ts) {
424
                        $tRow = mysqli_fetch_assoc($ts);
425
                        $templateId = $tRow['id'];
426
                        mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`" . $table_prefix . "site_tmplvar_templates` (tmplvarid, templateid) VALUES($id, $templateId)");
427
                   }
428
                }
429
            }
430
        }
431
    }
432
}
433
434
// Install Chunks
435
if (isset ($_POST['chunk']) || $installData) {
436
    echo "<h3>" . $_lang['chunks'] . ":</h3> ";
437
    $selChunks = $_POST['chunk'];
438
    foreach ($moduleChunks as $k=>$moduleChunk) {
439
        $installSample = in_array('sample', $moduleChunk[5]) && $installData == 1;
440
        $count_new_name = 0;
441
        if($installSample || in_array($k, $selChunks)) {
442
443
            $name = mysqli_real_escape_string($conn, $moduleChunk[0]);
444
            $desc = mysqli_real_escape_string($conn, $moduleChunk[1]);
445
            $category = mysqli_real_escape_string($conn, $moduleChunk[3]);
446
            $overwrite = mysqli_real_escape_string($conn, $moduleChunk[4]);
447
            $filecontent = $moduleChunk[2];
448
449
            if (!file_exists($filecontent))
450
                echo "<p>&nbsp;&nbsp;$name: <span class=\"notok\">" . $_lang['unable_install_chunk'] . " '$filecontent' " . $_lang['not_found'] . ".</span></p>";
451
            else {
452
453
                // Create the category if it does not already exist
454
                $category_id = getCreateDbCategory($category, $sqlParser);
455
456
                $chunk = preg_replace("/^.*?\/\*\*.*?\*\/\s+/s", '', file_get_contents($filecontent), 1);
457
                $chunk = mysqli_real_escape_string($conn, $chunk);
458
                $rs = mysqli_query($sqlParser->conn, "SELECT * FROM $dbase.`" . $table_prefix . "site_htmlsnippets` WHERE name='$name'");
459
                $count_original_name = mysqli_num_rows($rs);
460 View Code Duplication
                if($overwrite == 'false') {
461
                    $newname = $name . '-' . str_replace('.', '_', $modx_version);
462
                    $rs = mysqli_query($sqlParser->conn, "SELECT * FROM $dbase.`" . $table_prefix . "site_htmlsnippets` WHERE name='$newname'");
463
                    $count_new_name = mysqli_num_rows($rs);
464
                }
465
                $update = $count_original_name > 0 && $overwrite == 'true';
466
                if ($update) {
467
                    if (!mysqli_query($sqlParser->conn, "UPDATE $dbase.`" . $table_prefix . "site_htmlsnippets` SET snippet='$chunk', description='$desc', category=$category_id WHERE name='$name';")) {
468
                        $errors += 1;
469
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
470
                        return;
471
                    }
472
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['upgraded'] . "</span></p>";
473
                } elseif($count_new_name == 0) {
474
                    if($count_original_name > 0 && $overwrite == 'false') {
475
                        $name = $newname;
476
                    }
477
                    if (!mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`" . $table_prefix . "site_htmlsnippets` (name,description,snippet,category) VALUES('$name','$desc','$chunk',$category_id);")) {
478
                        $errors += 1;
479
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
480
                        return;
481
                    }
482
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['installed'] . "</span></p>";
483
                }
484
            }
485
        }
486
    }
487
}
488
489
// Install Modules
490
if (isset ($_POST['module']) || $installData) {
491
    echo "<h3>" . $_lang['modules'] . ":</h3> ";
492
    $selModules = $_POST['module'];
493
    foreach ($moduleModules as $k=>$moduleModule) {
494
        $installSample = in_array('sample', $moduleModule[7]) && $installData == 1;
495
        if($installSample || in_array($k, $selModules)) {
496
            $name = mysqli_real_escape_string($conn, $moduleModule[0]);
497
            $desc = mysqli_real_escape_string($conn, $moduleModule[1]);
498
            $filecontent = $moduleModule[2];
499
            $properties = $moduleModule[3];
500
            $guid = mysqli_real_escape_string($conn, $moduleModule[4]);
501
            $shared = mysqli_real_escape_string($conn, $moduleModule[5]);
502
            $category = mysqli_real_escape_string($conn, $moduleModule[6]);
503 View Code Duplication
            if (!file_exists($filecontent))
504
                echo "<p>&nbsp;&nbsp;$name: <span class=\"notok\">" . $_lang['unable_install_module'] . " '$filecontent' " . $_lang['not_found'] . ".</span></p>";
505
            else {
506
507
                // Create the category if it does not already exist
508
                $category = getCreateDbCategory($category, $sqlParser);
509
510
                $module = end(preg_split("/(\/\/)?\s*\<\?php/", file_get_contents($filecontent), 2));
0 ignored issues
show
Bug introduced by
preg_split('/(\\/\\/)?\\...tents($filecontent), 2) cannot be passed to end() as the parameter $array expects a reference.
Loading history...
511
                // $module = removeDocblock($module, 'module'); // Modules have no fileBinding, keep docblock for info-tab
512
                $module = mysqli_real_escape_string($conn, $module);
513
                $rs = mysqli_query($sqlParser->conn, "SELECT * FROM $dbase.`" . $table_prefix . "site_modules` WHERE name='$name'");
514
                if (mysqli_num_rows($rs)) {
515
                    $row = mysqli_fetch_assoc($rs);
516
                    $props = mysqli_real_escape_string($conn, propUpdate($properties,$row['properties']));
517
                    if (!mysqli_query($sqlParser->conn, "UPDATE $dbase.`" . $table_prefix . "site_modules` SET modulecode='$module', description='$desc', properties='$props', enable_sharedparams='$shared' WHERE name='$name';")) {
518
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
519
                        return;
520
                    }
521
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['upgraded'] . "</span></p>";
522
                } else {
523
                    $properties = mysqli_real_escape_string($conn, parseProperties($properties, true));
0 ignored issues
show
Unused Code introduced by
The call to parseProperties() has too many arguments starting with true.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
524
                    if (!mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`" . $table_prefix . "site_modules` (name,description,modulecode,properties,guid,enable_sharedparams,category) VALUES('$name','$desc','$module','$properties','$guid','$shared', $category);")) {
525
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
526
                        return;
527
                    }
528
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['installed'] . "</span></p>";
529
                }
530
            }
531
        }
532
    }
533
}
534
535
// Install Plugins
536
if (isset ($_POST['plugin']) || $installData) {
537
    echo "<h3>" . $_lang['plugins'] . ":</h3> ";
538
    $selPlugs = $_POST['plugin'];
539
    foreach ($modulePlugins as $k=>$modulePlugin) {
540
        $installSample = in_array('sample', $modulePlugin[8]) && $installData == 1;
541
        if($installSample || in_array($k, $selPlugs)) {
542
            $name = mysqli_real_escape_string($conn, $modulePlugin[0]);
543
            $desc = mysqli_real_escape_string($conn, $modulePlugin[1]);
544
            $filecontent = $modulePlugin[2];
545
            $properties = $modulePlugin[3];
546
            $events = explode(",", $modulePlugin[4]);
547
            $guid = mysqli_real_escape_string($conn, $modulePlugin[5]);
548
            $category = mysqli_real_escape_string($conn, $modulePlugin[6]);
549
            $leg_names = '';
550
            $disabled = $modulePlugin[9];
551 View Code Duplication
            if(array_key_exists(7, $modulePlugin)) {
552
                // parse comma-separated legacy names and prepare them for sql IN clause
553
                $leg_names = "'" . implode("','", preg_split('/\s*,\s*/', mysqli_real_escape_string($conn, $modulePlugin[7]))) . "'";
554
            }
555
            if (!file_exists($filecontent))
556
                echo "<p>&nbsp;&nbsp;$name: <span class=\"notok\">" . $_lang['unable_install_plugin'] . " '$filecontent' " . $_lang['not_found'] . ".</span></p>";
557
            else {
558
559
                // disable legacy versions based on legacy_names provided
560 View Code Duplication
                if(!empty($leg_names)) {
561
                    $update_query = "UPDATE $dbase.`" . $table_prefix . "site_plugins` SET disabled='1' WHERE name IN ($leg_names);";
562
                    $rs = mysqli_query($sqlParser->conn, $update_query);
563
                }
564
565
                // Create the category if it does not already exist
566
                $category = getCreateDbCategory($category, $sqlParser);
567
568
                $plugin = end(preg_split("/(\/\/)?\s*\<\?php/", file_get_contents($filecontent), 2));
0 ignored issues
show
Bug introduced by
preg_split('/(\\/\\/)?\\...tents($filecontent), 2) cannot be passed to end() as the parameter $array expects a reference.
Loading history...
569
                $plugin = removeDocblock($plugin, 'plugin');
570
                $plugin = mysqli_real_escape_string($conn, $plugin);
571
                $rs = mysqli_query($sqlParser->conn, "SELECT * FROM $dbase.`" . $table_prefix . "site_plugins` WHERE name='$name'");
572
                if (mysqli_num_rows($rs)) {
573
                    $insert = true;
574
                    while($row = mysqli_fetch_assoc($rs)) {
575
                        $props = mysqli_real_escape_string($conn, propUpdate($properties,$row['properties']));
576
                        if($row['description'] == $desc){
577 View Code Duplication
                            if (! mysqli_query($sqlParser->conn, "UPDATE $dbase.`" . $table_prefix . "site_plugins` SET plugincode='$plugin', description='$desc', properties='$props' WHERE id={$row['id']};")) {
578
                                echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
579
                                return;
580
                            }
581
                            $insert = false;
582 View Code Duplication
                        } else {
583
                            if (!mysqli_query($sqlParser->conn, "UPDATE $dbase.`" . $table_prefix . "site_plugins` SET disabled='1' WHERE id={$row['id']};")) {
584
                                echo "<p>".mysqli_error($sqlParser->conn)."</p>";
585
                                return;
586
                            }
587
                        }
588
                    }
589 View Code Duplication
                    if($insert === true) {
590
                        $properties = mysqli_real_escape_string($conn, propUpdate($properties,$row['properties']));
591
                        if(!mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`".$table_prefix."site_plugins` (name,description,plugincode,properties,moduleguid,disabled,category) VALUES('$name','$desc','$plugin','$properties','$guid','0',$category);")) {
592
                            echo "<p>".mysqli_error($sqlParser->conn)."</p>";
593
                            return;
594
                        }
595
                    }
596
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['upgraded'] . "</span></p>";
597
                } else {
598
                    $properties = mysqli_real_escape_string($conn, parseProperties($properties, true));
0 ignored issues
show
Unused Code introduced by
The call to parseProperties() has too many arguments starting with true.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
599
                    if (!mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`" . $table_prefix . "site_plugins` (name,description,plugincode,properties,moduleguid,category,disabled) VALUES('$name','$desc','$plugin','$properties','$guid',$category,$disabled);")) {
600
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
601
                        return;
602
                    }
603
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['installed'] . "</span></p>";
604
                }
605
                // add system events
606 View Code Duplication
                if (count($events) > 0) {
607
                    $ds=mysqli_query($sqlParser->conn, "SELECT id FROM $dbase.`".$table_prefix."site_plugins` WHERE name='$name' AND description='$desc';");
608
                    if ($ds) {
609
                        $row = mysqli_fetch_assoc($ds);
610
                        $id = $row["id"];
611
                        // remove existing events
612
                        mysqli_query($sqlParser->conn, 'DELETE FROM ' . $dbase . '.`' . $table_prefix . 'site_plugin_events` WHERE pluginid = \'' . $id . '\'');
613
                        // add new events
614
                        mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`" . $table_prefix . "site_plugin_events` (pluginid, evtid) SELECT '$id' as 'pluginid',se.id as 'evtid' FROM $dbase.`" . $table_prefix . "system_eventnames` se WHERE name IN ('" . implode("','", $events) . "')");
615
                    }
616
                }
617
            }
618
        }
619
    }
620
}
621
622
// Install Snippets
623
if (isset ($_POST['snippet']) || $installData) {
624
    echo "<h3>" . $_lang['snippets'] . ":</h3> ";
625
    $selSnips = $_POST['snippet'];
626
    foreach ($moduleSnippets as $k=>$moduleSnippet) {
627
        $installSample = in_array('sample', $moduleSnippet[5]) && $installData == 1;
628
        if($installSample || in_array($k, $selSnips)) {
629
            $name = mysqli_real_escape_string($conn, $moduleSnippet[0]);
630
            $desc = mysqli_real_escape_string($conn, $moduleSnippet[1]);
631
            $filecontent = $moduleSnippet[2];
632
            $properties = $moduleSnippet[3];
633
            $category = mysqli_real_escape_string($conn, $moduleSnippet[4]);
634 View Code Duplication
            if (!file_exists($filecontent))
635
                echo "<p>&nbsp;&nbsp;$name: <span class=\"notok\">" . $_lang['unable_install_snippet'] . " '$filecontent' " . $_lang['not_found'] . ".</span></p>";
636
            else {
637
638
                // Create the category if it does not already exist
639
                $category = getCreateDbCategory($category, $sqlParser);
640
641
                $snippet = end(preg_split("/(\/\/)?\s*\<\?php/", file_get_contents($filecontent)));
0 ignored issues
show
Bug introduced by
preg_split('/(\\/\\/)?\\...contents($filecontent)) cannot be passed to end() as the parameter $array expects a reference.
Loading history...
642
                $snippet = removeDocblock($snippet, 'snippet');
643
                $snippet = mysqli_real_escape_string($conn, $snippet);
644
                $rs = mysqli_query($sqlParser->conn, "SELECT * FROM $dbase.`" . $table_prefix . "site_snippets` WHERE name='$name'");
645
                if (mysqli_num_rows($rs)) {
646
                    $row = mysqli_fetch_assoc($rs);
647
                    $props = mysqli_real_escape_string($conn, propUpdate($properties,$row['properties']));
648
                    if (!mysqli_query($sqlParser->conn, "UPDATE $dbase.`" . $table_prefix . "site_snippets` SET snippet='$snippet', description='$desc', properties='$props' WHERE name='$name';")) {
649
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
650
                        return;
651
                    }
652
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['upgraded'] . "</span></p>";
653
                } else {
654
                    $properties = mysqli_real_escape_string($conn, parseProperties($properties, true));
0 ignored issues
show
Unused Code introduced by
The call to parseProperties() has too many arguments starting with true.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
655
                    if (!mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`" . $table_prefix . "site_snippets` (name,description,snippet,properties,category) VALUES('$name','$desc','$snippet','$properties',$category);")) {
656
                        echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
657
                        return;
658
                    }
659
                    echo "<p>&nbsp;&nbsp;$name: <span class=\"ok\">" . $_lang['installed'] . "</span></p>";
660
                }
661
            }
662
        }
663
    }
664
}
665
666
// Install demo-site
667
if ($installData && $moduleSQLDataFile) {
668
    echo "<p>" . $_lang['installing_demo_site'];
669
    $sqlParser->process($moduleSQLDataFile);
670
    // display database results
671
    if ($sqlParser->installFailed == true) {
672
        $errors += 1;
673
        echo "<span class=\"notok\"><b>" . $_lang['database_alerts'] . "</span></p>";
674
        echo "<p>" . $_lang['setup_couldnt_install'] . "</p>";
675
        echo "<p>" . $_lang['installation_error_occured'] . "<br /><br />";
676
        for ($i = 0; $i < count($sqlParser->mysqlErrors); $i++) {
677
            echo "<em>" . $sqlParser->mysqlErrors[$i]["error"] . "</em>" . $_lang['during_execution_of_sql'] . "<span class='mono'>" . strip_tags($sqlParser->mysqlErrors[$i]["sql"]) . "</span>.<hr />";
678
        }
679
        echo "</p>";
680
        echo "<p>" . $_lang['some_tables_not_updated'] . "</p>";
681
        return;
682 View Code Duplication
    } else {
683
        $sql = sprintf("SELECT id FROM `%ssite_templates` WHERE templatename='EVO startup - Bootstrap'", $sqlParser->prefix);
684
        $rs = mysqli_query($sqlParser->conn, $sql);
685
        if(mysqli_num_rows($rs)) {
686
            $row = mysqli_fetch_assoc($rs);
687
            $sql = sprintf('UPDATE `%ssite_content` SET template=%s WHERE template=4', $sqlParser->prefix, $row['id']);
688
            mysqli_query($sqlParser->conn, $sql);
689
        }
690
        echo '<span class="ok">'.$_lang['ok']."</span></p>";
691
    }
692
}
693
694
// Install Dependencies
695
foreach ($moduleDependencies as $dependency) {
696
	$ds = mysqli_query($sqlParser->conn, 'SELECT id, guid FROM ' . $dbase . '`' . $sqlParser->prefix . 'site_modules` WHERE name="' . $dependency['module'] . '"');
697 View Code Duplication
	if (!$ds) {
698
		echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
699
		return;
700
	} else {
701
		$row = mysqli_fetch_assoc($ds);
702
		$moduleId = $row["id"];
703
		$moduleGuid = $row["guid"];
704
	}
705
	// get extra id
706
	$ds = mysqli_query($sqlParser->conn, 'SELECT id FROM ' . $dbase . '`' . $sqlParser->prefix . 'site_' . $dependency['table'] . '` WHERE ' . $dependency['column'] . '="' . $dependency['name'] . '"');
707 View Code Duplication
	if (!$ds) {
708
		echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
709
		return;
710
	} else {
711
		$row = mysqli_fetch_assoc($ds);
712
		$extraId = $row["id"];
713
	}
714
	// setup extra as module dependency
715
	$ds = mysqli_query($sqlParser->conn, 'SELECT module FROM ' . $dbase . '`' . $sqlParser->prefix . 'site_module_depobj` WHERE module=' . $moduleId . ' AND resource=' . $extraId . ' AND type=' . $dependency['type'] . ' LIMIT 1');
716
	if (!$ds) {
717
		echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
718
		return;
719
	} else {
720
		if (mysqli_num_rows($ds) === 0) {
721
			mysqli_query($sqlParser->conn, 'INSERT INTO ' . $dbase . '`' . $sqlParser->prefix . 'site_module_depobj` (module, resource, type) VALUES(' . $moduleId . ',' . $extraId . ',' . $dependency['type'] . ')');
722
			echo '<p>&nbsp;&nbsp;' . $dependency['module'] . ' Module: <span class="ok">' . $_lang['depedency_create'] . '</span></p>';
723 View Code Duplication
		} else {
724
			mysqli_query($sqlParser->conn, 'UPDATE ' . $dbase . '`' . $sqlParser->prefix . 'site_module_depobj` SET module = ' . $moduleId . ', resource = ' . $extraId . ', type = ' . $dependency['type'] . ' WHERE module=' . $moduleId . ' AND resource=' . $extraId . ' AND type=' . $dependency['type']);
725
			echo '<p>&nbsp;&nbsp;' . $dependency['module'] . ' Module: <span class="ok">' . $_lang['depedency_update'] . '</span></p>';
726
		}
727
		if ($dependency['type'] == 30 || $dependency['type'] == 40) {
728
			// set extra guid for plugins and snippets
729
			$ds = mysqli_query($sqlParser->conn, 'SELECT id FROM ' . $dbase . '`' . $sqlParser->prefix . 'site_' . $dependency['table'] . '` WHERE id=' . $extraId . ' LIMIT 1');
730
			if (!$ds) {
731
				echo "<p>" . mysqli_error($sqlParser->conn) . "</p>";
732
				return;
733 View Code Duplication
			} else {
734
				if (mysqli_num_rows($ds) != 0) {
735
					mysqli_query($sqlParser->conn, 'UPDATE ' . $dbase . '`' . $sqlParser->prefix . 'site_' . $dependency['table'] . '` SET moduleguid = ' . $moduleGuid . ' WHERE id=' . $extraId);
736
					echo '<p>&nbsp;&nbsp;' . $dependency['name'] . ': <span class="ok">' . $_lang['guid_set'] . '</span></p>';
737
				}
738
			}
739
		}
740
	}
741
}
742
743
// call back function
744
if ($callBackFnc != "")
745
    $callBackFnc ($sqlParser);
746
747
// Setup the MODX API -- needed for the cache processor
748
define('MODX_API_MODE', true);
749
define('MODX_BASE_PATH', $base_path);
750
if (!defined('MODX_MANAGER_PATH')) define('MODX_MANAGER_PATH', $base_path.MGR_DIR.'/');
751
$database_type = 'mysqli';
752
// initiate a new document parser
753
include_once('../'.MGR_DIR.'/includes/document.parser.class.inc.php');
754
$modx = new DocumentParser;
755
$modx->db->connect();
756
// always empty cache after install
757
include_once "../".MGR_DIR."/processors/cache_sync.class.processor.php";
758
$sync = new synccache();
759
$sync->setCachepath("../assets/cache/");
760
$sync->setReport(false);
761
$sync->emptyCache(); // first empty the cache
762
763
// try to chmod the cache go-rwx (for suexeced php)
764
$chmodSuccess = @chmod('../assets/cache/siteCache.idx.php', 0600);
765
$chmodSuccess = @chmod('../assets/cache/sitePublishing.idx.php', 0600);
766
767
// remove any locks on the manager functions so initial manager login is not blocked
768
mysqli_query($conn, "TRUNCATE TABLE `".$table_prefix."active_users`");
769
770
// close db connection
771
$sqlParser->close();
772
773
// andrazk 20070416 - release manager access
774
if (file_exists('../assets/cache/installProc.inc.php')) {
775
    @chmod('../assets/cache/installProc.inc.php', 0755);
776
    unlink('../assets/cache/installProc.inc.php');
777
}
778
779
// setup completed!
780
echo "<p><b>" . $_lang['installation_successful'] . "</b></p>";
781
echo "<p>" . $_lang['to_log_into_content_manager'] . "</p>";
782
if ($installMode == 0) {
783
    echo "<p><img src=\"img/ico_info.png\" width=\"40\" height=\"42\" align=\"left\" style=\"margin-right:10px;\" />" . $_lang['installation_note'] . "</p>";
784
} else {
785
    echo "<p><img src=\"img/ico_info.png\" width=\"40\" height=\"42\" align=\"left\" style=\"margin-right:10px;\" />" . $_lang['upgrade_note'] . "</p>";
786
}
787
788
/**
789
 * Property Update function
790
 *
791
 * @param string $new
792
 * @param string $old
793
 * @return string
0 ignored issues
show
Documentation introduced by
Should the return type not be string|integer?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
794
 */
795 View Code Duplication
function propUpdate($new,$old){
0 ignored issues
show
Best Practice introduced by
The function propUpdate() has been defined more than once; this definition is ignored, only the first definition in install/cli-install.php (L1519-1531) is considered.

This check looks for functions that have already been defined in other files.

Some Codebases, like WordPress, make a practice of defining functions multiple times. This may lead to problems with the detection of function parameters and types. If you really need to do this, you can mark the duplicate definition with the @ignore annotation.

/**
 * @ignore
 */
function getUser() {

}

function getUser($id, $realm) {

}

See also the PhpDoc documentation for @ignore.

Loading history...
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
796
    $newArr = parseProperties($new);
797
    $oldArr = parseProperties($old);
798
    foreach ($oldArr as $k => $v){
799
        if (isset($v['0']['options'])){
800
            $oldArr[$k]['0']['options'] = $newArr[$k]['0']['options'];
801
        }
802
    }
803
    $return = $oldArr + $newArr;
804
    $return = json_encode($return, JSON_UNESCAPED_UNICODE);
0 ignored issues
show
Unused Code introduced by
The call to json_encode() has too many arguments starting with JSON_UNESCAPED_UNICODE.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
805
    $return = ($return !== '[]') ? $return : '';
806
    return $return;
807
}
808
809
/**
810
 * @param string $propertyString
811
 * @param bool|mixed $json
812
 * @return string
813
 */
814 View Code Duplication
function parseProperties($propertyString, $json=false) {
0 ignored issues
show
Best Practice introduced by
The function parseProperties() has been defined more than once; this definition is ignored, only the first definition in install/cli-install.php (L498-516) is considered.

This check looks for functions that have already been defined in other files.

Some Codebases, like WordPress, make a practice of defining functions multiple times. This may lead to problems with the detection of function parameters and types. If you really need to do this, you can mark the duplicate definition with the @ignore annotation.

/**
 * @ignore
 */
function getUser() {

}

function getUser($id, $realm) {

}

See also the PhpDoc documentation for @ignore.

Loading history...
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
815
    $propertyString = str_replace('{}', '', $propertyString );
816
    $propertyString = str_replace('} {', ',', $propertyString );
817
818
    if(empty($propertyString)) return array();
819
    if($propertyString=='{}' || $propertyString=='[]') return array();
820
821
    $jsonFormat = isJson($propertyString, true);
822
    $property = array();
823
    // old format
824
    if ( $jsonFormat === false) {
825
        $props= explode('&', $propertyString);
826
        foreach ($props as $prop) {
827
            $prop = trim($prop);
828
            if($prop === '') {
829
                continue;
830
            }
831
832
            $arr = explode(';', $prop);
833
            if( ! is_array($arr)) {
834
                $arr = array();
835
            }
836
            $key = explode('=', isset($arr[0]) ? $arr[0] : '');
837
            if( ! is_array($key) || empty($key[0])) {
838
                continue;
839
            }
840
841
            $property[$key[0]]['0']['label'] = isset($key[1]) ? trim($key[1]) : '';
842
            $property[$key[0]]['0']['type'] = isset($arr[1]) ? trim($arr[1]) : '';
843
            switch ($property[$key[0]]['0']['type']) {
844
                case 'list':
845
                case 'list-multi':
846
                case 'checkbox':
847
                case 'radio':
848
                case 'menu':
849
                    $property[$key[0]]['0']['value'] = isset($arr[3]) ? trim($arr[3]) : '';
850
                    $property[$key[0]]['0']['options'] = isset($arr[2]) ? trim($arr[2]) : '';
851
                    $property[$key[0]]['0']['default'] = isset($arr[3]) ? trim($arr[3]) : '';
852
                    break;
853
                default:
854
                    $property[$key[0]]['0']['value'] = isset($arr[2]) ? trim($arr[2]) : '';
855
                    $property[$key[0]]['0']['default'] = isset($arr[2]) ? trim($arr[2]) : '';
856
            }
857
            $property[$key[0]]['0']['desc'] = '';
858
859
        }
860
    // new json-format
861
    } else if(!empty($jsonFormat)){
862
        $property = $jsonFormat;
863
    }
864
    if ($json) {
865
        $property = json_encode($property, JSON_UNESCAPED_UNICODE);
0 ignored issues
show
Unused Code introduced by
The call to json_encode() has too many arguments starting with JSON_UNESCAPED_UNICODE.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
866
    }
867
    $property = ($property !== '[]') ? $property : '';
868
    return $property;
869
}
870
871
/**
872
 * @param string $string
873
 * @param bool $returnData
874
 * @return bool|mixed
875
 */
876
function isJson($string, $returnData=false) {
0 ignored issues
show
Best Practice introduced by
The function isJson() has been defined more than once; this definition is ignored, only the first definition in install/cli-install.php (L1600-1603) is considered.

This check looks for functions that have already been defined in other files.

Some Codebases, like WordPress, make a practice of defining functions multiple times. This may lead to problems with the detection of function parameters and types. If you really need to do this, you can mark the duplicate definition with the @ignore annotation.

/**
 * @ignore
 */
function getUser() {

}

function getUser($id, $realm) {

}

See also the PhpDoc documentation for @ignore.

Loading history...
877
    $data = json_decode($string, true);
878
    return (json_last_error() == JSON_ERROR_NONE) ? ($returnData ? $data : true) : false;
879
}
880
881
/**
882
 * @param string|int $category
883
 * @param SqlParser $sqlParser
884
 * @return int
885
 */
886 View Code Duplication
function getCreateDbCategory($category, $sqlParser) {
0 ignored issues
show
Best Practice introduced by
The function getCreateDbCategory() has been defined more than once; this definition is ignored, only the first definition in install/cli-install.php (L1610-1629) is considered.

This check looks for functions that have already been defined in other files.

Some Codebases, like WordPress, make a practice of defining functions multiple times. This may lead to problems with the detection of function parameters and types. If you really need to do this, you can mark the duplicate definition with the @ignore annotation.

/**
 * @ignore
 */
function getUser() {

}

function getUser($id, $realm) {

}

See also the PhpDoc documentation for @ignore.

Loading history...
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
887
    $dbase = $sqlParser->dbname;
888
    $dbase = '`' . trim($dbase,'`') . '`';
889
    $table_prefix = $sqlParser->prefix;
890
    $category_id = 0;
891
    if(!empty($category)) {
892
        $category = mysqli_real_escape_string($sqlParser->conn, $category);
893
        $rs = mysqli_query($sqlParser->conn, "SELECT id FROM $dbase.`".$table_prefix."categories` WHERE category = '".$category."'");
894
        if(mysqli_num_rows($rs) && ($row = mysqli_fetch_assoc($rs))) {
895
            $category_id = $row['id'];
896
        } else {
897
            $q = "INSERT INTO $dbase.`".$table_prefix."categories` (`category`) VALUES ('{$category}');";
898
            $rs = mysqli_query($sqlParser->conn, $q);
899
            if($rs) {
900
                $category_id = mysqli_insert_id($sqlParser->conn);
901
            }
902
        }
903
    }
904
    return $category_id;
905
}
906
907
/**
908
 * Remove installer Docblock only from components using plugin FileSource / fileBinding
909
 *
910
 * @param string $code
911
 * @param string $type
912
 * @return string
913
 */
914 View Code Duplication
function removeDocblock($code, $type) {
0 ignored issues
show
Best Practice introduced by
The function removeDocblock() has been defined more than once; this definition is ignored, only the first definition in install/cli-install.php (L1638-1664) is considered.

This check looks for functions that have already been defined in other files.

Some Codebases, like WordPress, make a practice of defining functions multiple times. This may lead to problems with the detection of function parameters and types. If you really need to do this, you can mark the duplicate definition with the @ignore annotation.

/**
 * @ignore
 */
function getUser() {

}

function getUser($id, $realm) {

}

See also the PhpDoc documentation for @ignore.

Loading history...
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
915
916
    $cleaned = preg_replace("/^.*?\/\*\*.*?\*\/\s+/s", '', $code, 1);
917
918
    // Procedure taken from plugin.filesource.php
919
    switch($type) {
920
        case 'snippet':
921
            $elm_name = 'snippets';
922
            $include = 'return require';
923
            $count = 47;
924
            break;
925
926
        case 'plugin':
927
            $elm_name = 'plugins';
928
            $include = 'require';
929
            $count = 39;
930
            break;
931
932
        default:
933
            return $cleaned;
934
    };
935
    if(substr(trim($cleaned),0,$count) == $include.' MODX_BASE_PATH.\'assets/'.$elm_name.'/')
936
        return $cleaned;
937
938
    // fileBinding not found - return code incl docblock
939
    return $code;
940
}
941