Issues (1751)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

ftp/loader.php (11 issues)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
#!/usr/bin/env php
2
<?php
3
	if ($argc > 1) {
4
		$configfile=$argv[1];
5
	} else {
6
		$configfile="default.phtml";
7
	}
8
9
	$ARLoader = 'ftp';
10
	$currentDir = getcwd();
11
	$ariadne = dirname($currentDir).'/lib/';
12
13
	if (!@include_once($ariadne."/bootstrap.php")) {
14
		chdir(substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/')));
15
		$ariadne = dirname(getcwd()).'/lib/';
16
17
		if(!include_once($ariadne."/bootstrap.php")){
18
			echo "could not find Ariadne";
19
			exit(1);
20
		}
21
22
		chdir($currentDir);
23
	}
24
25
	require_once($ariadne."/configs/ftp/$configfile");
26
	require_once($ariadne."/modules/mod_mimemagic.php");
27
28
		/* this function has been taken from the php manual		*/
29
30
		function ftp_ErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) {
31
			if ($errno!= 2 && $errno!=8 ) {
32
			    // timestamp for the error entry
33
			    $dt = date("Y-m-d H:i:s (T)");
34
35
			    // define an assoc array of error string
36
			    // in reality the only entries we should
37
			    // consider are 2,8,256,512 and 1024
38
			    $errortype = array (
39
			                1   =>  "Error",
40
			                2   =>  "Warning",
41
			                4   =>  "Parsing Error",
42
			                8   =>  "Notice",
43
			                16  =>  "Core Error",
44
			                32  =>  "Core Warning",
45
			                64  =>  "Compile Error",
46
			                128 =>  "Compile Warning",
47
			                256 =>  "User Error",
48
			                512 =>  "User Warning",
49
			                1024=>  "User Notice"
50
			                );
51
			    // set of errors for which a var trace will be saved
52
			    $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
53
54
			    $err = "<errorentry>\n";
55
			    $err .= "\t<datetime>".$dt."</datetime>\n";
56
			    $err .= "\t<errornum>".$errno."</errnumber>\n";
57
			    $err .= "\t<errortype>".$errortype[$errno]."</errortype>\n";
58
			    $err .= "\t<errormsg>".$errmsg."</errormsg>\n";
59
			    $err .= "\t<scriptname>".$filename."</scriptname>\n";
60
			    $err .= "\t<scriptlinenum>".$linenum."</scriptlinenum>\n";
61
62
			    if (in_array($errno, $user_errors)) {
63
					 $err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n";
64
				 }
65
			    $err .= "</errorentry>\n\n";
66
67
				debug($err);
68
			}
69
		}
70
71
72
		function ftp_OpenDC() {
73
		global $FTP, $ftp_config;
74
75
			$FTP->DC["transfered"]=0;
76
			if ($FTP->DC["mode"]==="active") {
77
				$socket=socket_create(AF_INET, SOCK_STREAM, 0);
78
				if ($socket>=0) {
79
					debug("ftp: opened socket");
80
					@socket_bind($socket, $ftp_config['server_ip']);
81
					$result=socket_connect($socket, $FTP->DC["address"], $FTP->DC["port"]);
82
					if ($result < 0) {
83
						ftp_Tell(425, "Couldn't build data connection (rm: connection error: ".strerror($result).")");
84
						$result=false;
85
					} else {
86
						debug("ftp: connected");
87
						$FTP->DC["msgsocket"]=$socket;
88
						$result=true;
89
					}
90
				} else {
91
					ftp_Tell(425, "Couldn't build data connection (rm: socket error: ".strerror($socket).")");
92
					$result=false;
93
				}
94
			} else {
95
				// do passive mode
96
				debug("ftp::OpenDC waiting on socket accept");
97
				$counter = 0;
98
				$msgsocket = false;
99
				while ( $counter < 300 && !is_resource($msgsocket) ) {
100
					$counter++;
101
					// wait for 0.1 secondes
102
					usleep(100000);
103
					$msgsocket=socket_accept($FTP->DC["socket"]);
104
				}
105
				debug("ftp::OpenDC socket accepted? (".$msgsocket.")");
106
				if (!is_resource($msgsocket) ) {
107
					ftp_Tell(425, "Couldn't build data connection");
108
					$result=false;
109
				} else {
110
					debug("ftp: accept_connect returned $msgsocket");
111
					socket_set_blocking($msgsocket, true);
112
					debug("ftp: connected ($msgsocket)");
113
					$FTP->DC["msgsocket"]=$msgsocket;
114
					$result=true;
115
				}
116
				socket_close($FTP->DC["socket"]);
117
			}
118
119
			if ($result) {
120
				if ($FTP->DC["ob_active"]) {
121
					debug("error: OOPS, dc ob not closed!!");
122
				} else {
123
					$FTP->DC["ob_active"]=true;
124
					if (ob_start("ftp_WriteDC")) {
125
						debug("ftp_OpenDC:: opening ob");
126
					} else {
127
						debug("ftp_OpendDC:: could not open ob");
128
					}
129
				}
130
			}
131
			return $result;
132
		}
133
134
		function ftp_GetPasv() {
135
		global $FTP;
136
			// client issued 'pasv' command
137
			// so lets try to bind a socket to a port
138
			$result=false;
139
			if ($FTP->DC["socket_desc"]) {
140
				// we alread got a socket open.. let's use it
141
				$result = $FTP->DC["socket_desc"];
142
			} else {
143
				$socket=socket_create(AF_INET, SOCK_STREAM, 0);
144
				if ($socket>=0) {
145
					debug("ftp: open socket ($socket) (pasv mode)");
146
147
					// FIXME: make this configurable!
148
					$bound=0;
149
					$port=12000;
150
					while (!$bound && $port<=12100) {
151
						$bound=socket_bind($socket, $FTP->server_ip, $port);
152
						debug("ftp::pasv socket_bind port $port ($bound)");
153
						if (!$bound) {
154
							$port++;
155
						}
156
					}
157
158
					if ($bound) {
159
						$ret=socket_listen($socket, 1);
160
						socket_set_nonblock($socket);
161
						if ($ret < 0) {
162
							ftp_Tell(425, "Couldn't build data connection (rm: socket error:".strerror($socket).")");
163
						} else {
164
							$FTP->DC["mode"]="passive";
165
							$FTP->DC["socket"]=$socket;
166
							debug("ftp: listening on port $port");
167
							$result=str_replace(".", ",", $FTP->server_ip);
168
							$result.=",".(((int)$port) >> 8);
169
							$result.=",".($port & 0x00FF);
170
							//$FTP->DC["socket_desc"]=$result;
171
						}
172
					} else {
173
						ftp_Tell(425, "Couldn't build data connection:  couldn't bind to a socket");
174
					}
175
176
				} else {
177
					ftp_Tell(425, "Couldn't build data connection (rm: socket error:".strerror($socket).")");
178
				}
179
			}
180
181
			return $result;
182
		}
183
184
185
		function ftp_WriteDC($bdata) {
186
		global $FTP;
187
			/*
188
				make a copy of $data otherwise we will crash php
189
				(you can't write to data from an output buffer)
190
			*/
191
			if ($FTP->resume) {
192
				debug("ftp::WriteDC() truncating data");
193
				$data = substr($bdata, $FTP->resume);
194
			} else {
195
				$data = $bdata;
196
			}
197
198
			/* free unused data */
199
			unset($bdata);
200
201
			if (strlen($data)) {
202
				debug("ftp::WriteDC([data]) (".strlen($data).")");
203
				if ($FTP->DC["type"]==="A") {
204
					$offset = 0;
205
					$chunk = substr($data, $offset, 4096);
206
					while ($chunk!==false) {
207
						$chunk=str_replace("\n", "\r\n", $chunk);
208
						$len = strlen($chunk);
209
						debug("ftp_WriteDC:: writing chunk([chunk], $offset, 4096) (".$len.")");
210
						if (!socket_write($FTP->DC["msgsocket"], $chunk, $len)) {
211
							debug("ftp_WriteDC:: chunk ERROR write $len bytes!");
212
							$chunk = false;
213
						} else {
214
							debug("ftp_WriteDC:: chunk success");
215
							//$offset+=strlen($chunk);
216
							$offset += 4096;
217
							$FTP->DC["transfered"]+=strlen($data);
218
							$chunk = substr($data, $offset, 4096);
219
						}
220
					}
221
222
				} else {
223
					$len=strlen($data);
224
					debug("ftp_WriteDC:: writing len (".$len.")");
225
					if (!socket_write($FTP->DC["msgsocket"], $data, $len)) {
226
						debug("ftp_WriteDC:: ERROR writing $len bytes!");
227
					} else {
228
						debug("ftp_WriteDC:: success");
229
					}
230
					$FTP->DC["transfered"]+=strlen($data);
231
				}
232
			}
233
234
			return "";	// empty string
235
		}
236
237
		function ftp_ReadDC() {
238
		global $FTP;
239
			$data = socket_read($FTP->DC["msgsocket"], 3000, PHP_BINARY_READ);
240
			if (strlen($data) && ($FTP->DC["type"]==="A")) {
241
				if ($data[strlen($data)-1]==="\r") {
242
					$postdata = socket_read($FTP->DC["msgsocket"], 1, PHP_BINARY_READ);
243
					$data.=$postdata;
244
				}
245
				$data=str_replace("\r\n", "\n", $data);
246
			}
247
			debug("ftp::ReadDC() (".strlen($data).")");
248
			$FTP->DC["transfered"]+=strlen($data);
249
			return $data;
250
		}
251
252
		function ftp_CloseDC() {
253
		global $FTP;
254
			if ($FTP->DC["ob_active"]) {
255
				debug("ftp::CloseDC:: closing output buffer");
256
				ob_end_flush();
257
				debug("ftp::CLoseDC:: ok, ob closed");
258
				$FTP->DC["ob_active"]=false;
259
			}
260
261
			debug("ftp: closing connection");
262
			$con=$FTP->DC["msgsocket"];
263
			if ($con) {
264
				debug("ftp::CloseDC:: closing connection");
265
				socket_close($con);
266
				debug("ftp::CloseDC:: connection closed");
267
			}
268
		}
269
270
		function ftp_TranslatePath(&$path, &$listMode) {
271
		global $FTP;
272
			$listMode="";
273
			$absolute = ($path[0] === '/') ? true : false;
274
			$path=$FTP->site.$FTP->store->make_path($FTP->cwd, $path);
275 View Code Duplication
			while (preg_match('|/'.ESPCHL.'([^/]*)'.ESPCHR.'/|', $path, $regs) && $regs[1]) {
276
				$listMode=$regs[1];
277
				$path=str_replace("/".SPCHL.$listMode.SPCHR."/", "/", $path);
278
			}
279
			if (!$listMode) {
280
				if (!$absolute && $FTP->listMode) {
281
					$listMode=$FTP->listMode;
282
				} else {
283
					$listMode=$FTP->defaultListMode;
284
				}
285
			}
286
			debug("ftp: Translate:: (FTP->listMode = '$FTP->listMode', listMode = '$listMode', path = '$path')");
287
		}
288
289
		function ftp_TranslateTemplate(&$path, &$template) {
290
		global $FTP;
291
			$parent = $FTP->store->make_path($path, "..");
292
			$template = substr($path, strlen($parent), -1);
293
			$path = $parent;
294
		}
295
296
		function ftp_Run() {
297
		global $FTP, $ARCurrent, $ARBeenHere;
298
299
			while (ftp_FetchCMD($cmd, $args)) {
300
				$ARBeenHere=array();
301
				$ARCurrent->arLoginSilent = 0;
302
				$ARCurrent->ftp_error = "";
303
304
				if ($last_cmd != 'REST') {
0 ignored issues
show
The variable $last_cmd does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
305
					$FTP->resume = 0;
306
				}
307
				switch ($cmd) {
308
					case 'MDTM':
309
						$path = $args;
310
						ftp_TranslatePath($path, $listMode);
311
						switch ($listMode) {
312 View Code Duplication
							case 'templates':
313
								ftp_TranslateTemplate($path, $template);
314
315
								$result = current(
316
											$FTP->store->call("ftp.template.exists.phtml",
317
																array("arRequestedTemplate" => $template),
318
																$FTP->store->get($path)));
319
								$file_date = $result["date"];
320
321
								if ($file_date) {
322
									ftp_Tell(213, date("YmdHis", $file_date));
323
								} else {
324
									ftp_Tell(550, "No such file or directory");
325
								}
326
							break;
327
							default:
328
								if ($FTP->store->exists($path)) {
329
									$file_date = time(); // TODO fix
330
									ftp_Tell(213, date("YmdHis", $file_date));
331
								} else {
332
									ftp_Tell(550, "No such file or directory");
333
								}
334
							break;
335
						}
336
					break;
337
338
					case 'REST':
339
						$FTP->resume = (int)$args;
340
						ftp_Tell(350, 'Restarting at '.$FTP->resume.'.');
341
					break;
342
					case 'QUIT':
343
						ftp_Tell(221, "Goodbye.");
344
						/* check if we have to close a 'passive' socket */
345
						if ($FTP->DC["socket_desc"]) {
346
							socket_close($FTP->DC["socket"]);
347
						}
348
						return 0;
349
					break;
350
					case 'PWD':
351
						$dir=$FTP->cwd;
352
						if ($FTP->listMode) {
353
							$dir="/".SPCHL.$FTP->listMode.SPCHR.$dir;
354
						}
355
						if (strlen($dir)>1) {
356
							$dir=substr($dir,0,-1);
357
						}
358
						ftp_Tell(257, "\"$dir\" is current directory.");
359
					break;
360
					case 'HELP':
361
						ftp_Tell(214, "not implemented" );
362
					break;
363
					case 'PORT':
364
						$FTP->DC["mode"]="active";
365
						$host=explode(",",$args);
366
						$address=$host[0].".".$host[1].".".$host[2].".".$host[3];
367
						$FTP->DC["address"]=$address;
368
						$port=((int)$host[4]) << 8;
369
						$port+=(int)$host[5];
370
						$FTP->DC["port"]=$port;
371
						ftp_Tell(200, "ok, connecting to $address $port");
372
					break;
373
					case 'PASV':
374
						$port=ftp_GetPasv();
375
						if ($port) {
376
							ftp_Tell(227, "Entering Passive Mode ($port)");
377
						}
378
					break;
379 View Code Duplication
					case 'CDUP':
380
						$cwd=$FTP->store->make_path($FTP->cwd, "..");
381
						if ($FTP->store->exists($FTP->site.$cwd)) {
382
							$FTP->cwd=$cwd;
383
							ftp_Tell(250, "CDUP succesfull");
384
						} else {
385
							ftp_Tell(550, "CDUP not succesfull");
386
						}
387
					break;
388
					case 'CWD':
389
						/* if CWD path is absolute then listmode is set to
390
						the default value */
391
392
						$absolute = ($args[0]=="/") ? true : false;
393
						if ($absolute) {
394
							$FTP->listMode=$FTP->defaultListMode;
395
						}
396
397
						$path=$FTP->store->make_path($FTP->cwd, $args);
398
						debug("ftp: cwd absolute path is ($path)");
399 View Code Duplication
						while (preg_match('|/'.ESPCHL.'([^/]*)'.ESPCHR.'/|', $path, $regs) && $regs[1]) {
400
							$FTP->listMode=$regs[1];
401
							$path=str_replace("/".SPCHL.$FTP->listMode.SPCHR."/", "/", $path);
402
						}
403
						$cwd=$FTP->store->make_path($FTP->cwd, $path);
404
						if ($FTP->store->exists($FTP->site.$cwd)) {
405
							$result=current($FTP->store->call("system.get.phtml", "",
406
										$FTP->store->get($FTP->site.$cwd)));
407
							if ($result->type==="pshortcut") {
408
								debug("ftp: shortcut: ".$result->data->path);
409
								$cwd=$FTP->store->make_path($cwd, $result->data->path);
410
							}
411
412
							$FTP->cwd=$cwd;
413
							debug("ftp: cwd ($cwd) listmode(".$FTP->listMode.")");
414
							ftp_Tell(250, "CWD succesfull (listmode = ".$FTP->listMode.")");
415
						} else {
416
							ftp_Tell(550, "'$cwd' no such file or directory");
417
						}
418
					break;
419
420
					case 'TYPE':
421
						if (preg_match('/a|i/i', $args)) {
422
							$FTP->DC["type"]=strtoupper($args);
423
							ftp_Tell(200, "Type set to ".$args);
424
						} else {
425
							ftp_Tell(500, "Type $args not valid");
426
						}
427
					break;
428
429
					case 'SIZE':
430
						$path = $args;
431
						ftp_TranslatePath($path, $listMode);
432
						switch ($listMode) {
433 View Code Duplication
							case 'templates':
434
								ftp_TranslateTemplate($path, $template);
435
436
								$result = current(
437
											$FTP->store->call("ftp.template.exists.phtml",
438
																array("arRequestedTemplate" => $template),
439
																$FTP->store->get($path)));
440
								if (is_array($result)) {
441
									$file_size = $result["size"];
442
									ftp_Tell(213, (int)$file_size);
443
								} else {
444
									ftp_Tell(550, "No such file or directory");
445
								}
446
447
							break;
448 View Code Duplication
							default:
449
								if ($FTP->store->exists($path)) {
450
									$size = $FTP->store->call(
451
											"ftp.$listMode.size.phtml",
452
											"",
453
											$FTP->store->get($path));
454
									ftp_Tell(213, (int)$size[0]);
455
								} else {
456
									ftp_Tell(550, "No such file or directory");
457
								}
458
							break;
459
						}
460
					break;
461
462
					case 'RNFR':
463
						$rename_src_path = $args;
464
						ftp_TranslatePath($rename_src_path, $rename_src_listMode);
465
						if ($listMode === "templates") {
0 ignored issues
show
The variable $listMode does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
466
							ftp_TranslateTemplate($rename_src_path, $rename_src_template);
467
							$result = $FTP->store->call(
468
											"ftp.template.exists.phtml",
469
											array(
470
												"arRequestedTemplate" => $rename_src_template
471
											),
472
											$FTP->store->get($path));
0 ignored issues
show
The variable $path does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
473
474
							if (is_array($result) && current($result)) {
475
								ftp_Tell(350, "template exists, supply destination name.");
476
							} else {
477
								ftp_Tell(550, "template [".$rename_src_template."] does not exists.");
478
								$rename_src_path = "";
479
							}
480
481
						} else if ($FTP->store->exists($rename_src_path)) {
482
							ftp_Tell(350, "Object exists, supply destination name.");
483
						} else {
484
							ftp_Tell(550, "Object [".$rename_src_path."] does not exists.");
485
							$rename_src_path = "";
486
						}
487
					break;
488
489
					case 'RNTO':
490
						if ($rename_src_path) {
491
							$rename_dest_path = $args;
492
							ftp_TranslatePath($rename_dest_path, $rename_dest_listMode);
493
							if ($rename_dest_listMode === $rename_src_listMode) {
494
								if ($rename_dest_listMode === "templates") {
495
									$temp = $args;
496
									if ($temp[strlen($temp)-1] === "/") {
497
										$rename_dest_template = $rename_src_template;
0 ignored issues
show
The variable $rename_src_template does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
498
									} else {
499
										ftp_TranslateTemplate($rename_dest_path, $rename_dest_template);
500
									}
501
									$do_move = $FTP->store->exists($rename_dest_path);
502
								} else {
503
									if ($FTP->store->exists($rename_dest_path)) {
504
										$parent = $FTP->store->make_path($rename_src_path, "..");
0 ignored issues
show
The variable $rename_src_path does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
505
										$file = substr($rename_src_path, strlen($parent));
506
										$rename_dest_path.=$file;
507
									}
508
									$do_move = !$FTP->store->exists($rename_dest_path);
509
								}
510
511
								if ($do_move) {
512
									debug("ftp::RENAME ($rename_src_path, $rename_dest_path, ".$rename_src_listMode.", $rename_src_template, $rename_dest_template)");
0 ignored issues
show
The variable $rename_src_listMode does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
The variable $rename_dest_template does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
513
									$FTP->store->call("ftp.".$rename_src_listMode.".rename.phtml",
514
													array(
515
														"source" => $rename_src_path,
516
														"target" => $rename_dest_path,
517
														"source_template" => $rename_src_template,
518
														"target_template" => $rename_dest_template
519
													),
520
													$FTP->store->get($rename_src_path));
521
522 View Code Duplication
									if ($ARCurrent->ftp_error) {
523
										ftp_Tell(550, $ARCurrent->ftp_error);
524
										unset($ARCurrent->ftp_error);
525
									} else {
526
										ftp_Tell(250, "Rename successfull.");
527
									}
528
									$rename_src_path = "";
529
								} else {
530
									ftp_Tell(550, "Object [".$args."] does already exist.");
531
								}
532
							} else {
533
								ftp_Tell(550, "Moving objects between different modeses is not supported (yet).");
534
							}
535
						} else {
536
							ftp_Tell(550, "Expected RNFR");
537
						}
538
					break;
539
540
					case 'RETR':
541
						$path=$args;
542
						ftp_TranslatePath($path, $listMode);
543
						switch ($listMode) {
544
							case "templates":
545
								ftp_TranslateTemplate($path, $template);
546
								$getmode = "templates";
547
548
								$result = current(
549
											$FTP->store->call("ftp.template.exists.phtml",
550
																array("arRequestedTemplate" => $template),
551
																$FTP->store->get($path)));
552
								$file_size = $result["size"];
553
							break;
554
							default:
555
								$file_size = current(
556
											$FTP->store->call("ftp.files.size.phtml", "",
557
																$FTP->store->get($path)));
558
								$getmode = "files";
559
							break;
560
						}
561
562
						debug("ftp: opening $path / template $template");
0 ignored issues
show
The variable $template does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
563
564
						if (ftp_OpenDC()!==false) {
565
							if ($FTP->store->exists($path)) {
566
567
								$file_size -= $FTP->resume;
568
								ftp_Tell(150, "Opening ".(($FTP->DC["type"]==="A") ? 'ASCII' : 'BINARY')." mode data connection for $args ($file_size bytes)");
569
								$FTP->store->call("ftp.$getmode.get.phtml", array("arRequestedTemplate" => $template),
570
											$FTP->store->get($path));
571
								debug("ftp::get::going to close dc");
572
								ftp_CloseDC();
573
								debug("ftp::get::dc closed");
574
								ftp_Tell(226, "Transfer complete");
575
							} else {
576
								ftp_CloseDC();
577
								ftp_Tell(550, "$file does not exist");
0 ignored issues
show
The variable $file does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
578
							}
579
						}
580
					break;
581
582
					case 'NLST':
583
					case 'LIST':
584
						$args = chop($args);
585
						// only use the last word (some clients issue LIST -l [filename])
586
						$args=preg_replace('/(-[^[:space:]]+)?[[:space:]]*([^[:space:]]*)$/', '\2', $args);
587
						debug("LIST ARGS($args)");
588
						$path = $args;
589
						ftp_TranslatePath($path, $listMode);
590
						debug("ftp: LIST path=$path, mode=$listMode");
591
						if ($FTP->store->exists($path)) {
592
593
							ftp_Tell(150, "Opening ".(($FTP->DC["type"]==="A") ? 'ASCII' : 'BINARY')." mode data connection");
594
							if (ftp_OpenDC()!==false) {
595
								$mode = array();
596
								debug("ftp: listing ($path) ($listMode)");
597
598
								if ($FTP->symlinkListModes) {
599 View Code Duplication
									if ($listMode!=="files") {
600
										$mode["filename"]=SPCHL."files".SPCHR;
601
										$mode["date"]=time();
602
										if ($FTP->cwd!=="/") {
603
											$mode["type"]="shortcut";
604
											$mode["target"]=$FTP->cwd;
605
											if ($FTP->defaultListMode!="files") {
606
												$mode["target"]="/".SPCHL."files".SPCHR.$mode["target"];
607
											}
608
										} else {
609
											$mode["type"]="dir";
610
										}
611
										$mode["size"]=0;
612
										$mode["grants"]["read"]=true;
613
614
										if ($cmd!=="NLST") {
615
											$data=ftp_GenListEntry($mode);
616
											echo "$data";
617
										} else {
618
											echo $mode["filename"]."\n";
619
										}
620
									}
621
622 View Code Duplication
									if ($listMode!=="templates") {
623
										$mode["filename"]=SPCHL."templates".SPCHR;
624
										$mode["date"]=time();
625
										if ($FTP->cwd!=="/") {
626
											$mode["type"]="shortcut";
627
											$mode["target"]=$FTP->cwd;
628
											if ($FTP->defaultListMode!="templates") {
629
												$mode["target"]="/".SPCHL."templates".SPCHR.$mode["target"];
630
											}
631
										} else {
632
											$mode["type"]="dir";
633
										}
634
										$mode["size"]=0;
635
										$mode["grants"]["read"]=true;
636
										if ($cmd!=="NLST") {
637
											$data=ftp_GenListEntry($mode);
638
											echo "$data";
639
										} else {
640
											echo $mode["filename"]."\n";
641
										}
642
									}
643
644 View Code Duplication
									if ($listMode!=="objects") {
645
										$mode["filename"]=SPCHL."objects".SPCHR;
646
										$mode["date"]=time();
647
										$mode["size"]=0;
648
										$mode["grants"]["read"]=true;
649
										if ($FTP->cwd!=="/") {
650
											$mode["type"]="shortcut";
651
											$mode["target"]=$FTP->cwd;
652
											if ($FTP->defaultListMode!="objects") {
653
												$mode["target"]="/".SPCHL."objects".SPCHR.$mode["target"];
654
											}
655
										} else {
656
											$mode["type"]="dir";
657
										}
658
										if ($cmd!=="NLST") {
659
											$data=ftp_GenListEntry($mode);
660
											echo "$data";
661
										} else {
662
											echo $mode["filename"]."\n";
663
										}
664
									}
665
								}
666
								$template="ftp.".$listMode.".list.phtml";
667
								$result=current($FTP->store->call($template, "",
668
													$FTP->store->get($path)));
669
670
								debug("ftp: results(".sizeof($result).")");
671
								@reset($result);
672
								foreach ( $result as $entry ) {
673
									debug("ftp: file path = (".$entry["path"].")");
674 View Code Duplication
									if ($cmd!=="NLST") {
675
										$data=ftp_GenListEntry($entry);
676
										echo "$data";
677
									} else {
678
										$parent = $FTP->store->make_path($entry["path"], "..");
679
										$filename = $entry["path"] ? substr($entry["path"], strlen($parent), -1) : $entry["filename"];
680
										debug("ftp::nlst	".$filename);
681
										echo $filename."\n";
682
									}
683
								}
684
685
								ftp_CloseDC();
686
								ftp_Tell(226, "Transfer complete");
687
							} else {
688
								ftp_Tell(550, "Could not connect to client");
689
								debug("ftp: could not connect");
690
							}
691
						} else {
692
							ftp_TranslateTemplate($path, $template);
693
							debug("ftp::list maybe it's a template? ($path, $template)");
694
							$result = current($FTP->store->call("ftp.template.exists.phtml",
695
												array("arRequestedTemplate" => $template),
696
												$FTP->store->get($path)));
697
698
							if (is_array($result)) {
699
								ftp_Tell(150, "Opening ".(($FTP->DC["type"]==="A") ? 'ASCII' : 'BINARY')." mode data connection");
700
								if (ftp_OpenDC()!==false) {
701 View Code Duplication
									if ($cmd!=="NLST") {
702
										echo ftp_GenListEntry($result);
703
									} else {
704
										$parent = $FTP->store->make_path($result["path"], "..");
705
										$filename = $result["path"] ? substr($result["path"], strlen($parent), -1) : $result["filename"];
706
										debug("ftp::nlst	".$filename);
707
										echo $filename."\n";
708
									}
709
									ftp_CloseDC();
710
									ftp_Tell(226, "Transfer complete");
711
								} else {
712
									ftp_Tell(550, "Could not connect to client");
713
									debug("ftp: could not connect");
714
								}
715
							} else {
716
								ftp_Tell(550, "Directory not found");
717
							}
718
						}
719
					break;
720
721
					case 'RMD':
722
					case 'RMDIR':
723
					case 'DELE':
724
						$target = $args;
725
						ftp_TranslatePath($target, $listMode);
726
727
						debug("ftp: removing $target");
728
						if ($listMode==="templates") {
729
							$path = $FTP->store->make_path($target, "..");
730
							$template = substr($target, strlen($path), -1);
731
							debug("ftp: removing template ($path) ($template)");
732
							$FTP->store->call("ftp.templates.delete.phtml", array("template" => $template),
733
												$FTP->store->get($path));
734
735
							ftp_Tell(250, "$template removed");
736
						} else if ($FTP->store->exists($target)) {
737
								debug("ftp::delete ($target) ftp.$listMode.delete.phtml");
738
								$FTP->store->call("ftp.$listMode.delete.phtml", "",
739
									$FTP->store->get($target));
740
741 View Code Duplication
								if ($ARCurrent->ftp_error) {
742
									ftp_Tell(550, $ARCurrent->ftp_error);
743
									unset($ARCurrent->ftp_error);
744
								} else {
745
									ftp_Tell(250, "$target removed");
746
								}
747
						} else {
748
							ftp_Tell(550, "$target does not exist");
749
						}
750
					break;
751
752
					case 'STOR':
753
						$target = $args;
754
						ftp_TranslatePath($target, $listMode);
755
						$path = $FTP->store->make_path($target, "..");
756
757
						ftp_Tell(150, "Opening ".(($FTP->DC["type"]==="A") ? 'ASCII' : 'BINARY')." mode data connection");
758
						debug("ftp: client wants to store file ($target)");
759
						preg_match('|^/(.*/)?[^./]*[.]([^./]+)/$|i', $target, $regs);
760
						$ext = $regs[2];
761
						if (ftp_OpenDC()) {
762
							$tempfile=tempnam($FTP->store->get_config('files')."temp/", "upload");
763
							debug("tempfile: '$tempfile' ext: '$ext'");
764
							$tempfile.=$ext;
765
							$fp=fopen($tempfile, "wb");
766
							$fileinfo = array();
767
							if ($fp) {
768
								$fileinfo["tmp_name"]=$tempfile;
769
								if ($listMode === "templates") {
770
									ftp_TranslateTemplate($target, $template);
771
									$fileinfo["name"]=preg_replace('/[^.a-z0-9_-]/i', '_', $template);
772
773
									debug("ftp: writing to $tempfile\n");
774
									if ($FTP->resume) {
775
										debug("ftp::store resuming file at $FTP->resume");
776
										ob_start();
777
											$FTP->store->call("ftp.$listMode.get.phtml", array("arRequestedTemplate" => $template),
778
												$FTP->store->get($target));
779
											$data=ob_get_contents();
780
											fwrite($fp, substr($data, 0, $FTP->resume));
781
										ob_end_clean();
782
									}
783
									while (($data=ftp_ReadDC())) {
784
										fwrite($fp, $data);
785
									}
786
									fclose($fp);
787
									ftp_CloseDC();
788
									$fileinfo["type"]=get_mime_type($tempfile);
789 View Code Duplication
									if (!$fileinfo["type"]) {
790
										$fileinfo["type"]=get_mime_type($fileinfo["name"], MIME_EXT);
791
									}
792
									$fileinfo["size"]=filesize($tempfile);
793
794
									debug("ftp: writing template to  ($target$template)");
795
									$FTP->store->call("ftp.templates.save.phtml", array("file" => $fileinfo),
796
										$FTP->store->get($target));
797
								} else {
798
									$file=substr($target, strlen($path), -1);
799
									$fileinfo["name"]=preg_replace('/[^.a-z0-9_-]/i', '_', $file);
800
									if ($FTP->store->exists($target)) {
801
										debug("ftp::store updating $target");
802
										debug("ftp: writing to $tempfile\n");
803
										if ($FTP->resume) {
804
											debug("ftp::store resuming file at $FTP->resume");
805
											ob_start();
806
												$FTP->store->call("ftp.$listMode.get.phtml", "",
807
													$FTP->store->get($target));
808
												$data=ob_get_contents();
809
												debug("ftp::store resume pre-read ".strlen($data));
810
												fwrite($fp, substr($data, 0, $FTP->resume));
811
											ob_end_clean();
812
										}
813
										while (($data=ftp_ReadDC())) {
814
											fwrite($fp, $data);
815
										}
816
										fclose($fp);
817
										ftp_CloseDC();
818
819
										$fileinfo["type"]=get_mime_type($tempfile);
820 View Code Duplication
										if (!$fileinfo["type"]) {
821
											$fileinfo["type"]=get_mime_type($fileinfo["name"], MIME_EXT);
822
										}
823
										$fileinfo["size"]=filesize($tempfile);
824
										debug("ftp::store total size of fileupload is: ".$fileinfo["size"]);
825
										// if $target already exists
826
										$FTP->store->call("ftp.$listMode.save.phtml", array("file" => $fileinfo),
827
											$FTP->store->get($target));
828
									} else {
829
										debug("ftp::store storing $target");
830
										debug("ftp: writing to $tempfile\n");
831
										while (($data=ftp_ReadDC())) {
832
											fwrite($fp, $data);
833
										}
834
										fclose($fp);
835
										ftp_CloseDC();
836
837
										$fileinfo["type"]=get_mime_type($tempfile);
838 View Code Duplication
										if (!$fileinfo["type"]) {
839
											$fileinfo["type"]=get_mime_type($fileinfo["name"], MIME_EXT);
840
										}
841
										$fileinfo["size"]=filesize($tempfile);
842
843
										$FTP->store->call("ftp.$listMode.save.new.phtml", array("file" => $fileinfo),
844
											$FTP->store->get($path));
845
									}
846
								}
847
								if (file_exists($tempfile)) {
848
									@unlink($tempfile);
849
								}
850
851
							} else {
852
								debug("ftp: could not write to $filename\n");
0 ignored issues
show
The variable $filename does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
853
							}
854
855
							if ($ARCurrent->ftp_error) {
856
								ftp_Tell(550, $ARCurrent->ftp_error);
857
								unset($ARCurrent->ftp_error);
858
							} else {
859
								ftp_Tell(226, "Transfer complete (".$fileinfo["name"].")");
860
							}
861
						} else {
862
							debug("ftp: error connecting to client");
863
							ftp_Tell(550, "Could not establish a connection");
864
						}
865
					break;
866
867
					case 'MKD':
868
						$path_requested = $args;
869
						$path=preg_replace("|/".ESPCHL.'[^/]*'.ESPCHR."/|", "/", $args);
870
						preg_match('|^(.*[/])?(.*)$|i', $path, $regs);
871
						$arNewFilename=preg_replace('/[^.a-z0-9_-]/i', '_', $regs[2]);
872
873
						$path=$FTP->site.$FTP->store->make_path($FTP->cwd, $path);
874
						$parent=$FTP->store->make_path($path, "..");
875
876
						debug("ftp: mkdir: name = '$arNewFilename' path = '$path' parent = '$parent'");
877
878
						if ($FTP->store->exists($parent)) {
879
							if (!$FTP->store->exists($path)) {
880
								$FTP->store->call("ftp.mkdir.phtml", array("arNewFilename" => $arNewFilename),
881
									$FTP->store->get($parent));
882
							} else {
883
								$ARCurrent->ftp_error="Directory already exists";
884
							}
885
						} else {
886
							$ARCurrent->ftp_error="Could not find path $parent";
887
						}
888
889 View Code Duplication
						if ($ARCurrent->ftp_error) {
890
							ftp_Tell(550, $ARCurrent->ftp_error);
891
							unset($ARCurrent->ftp_error);
892
						} else {
893
							ftp_Tell(257, "\"$path_requested\" - Directory successfully created.");
894
						}
895
					break;
896
897
					case 'SYST':
898
						ftp_Tell(215, "UNIX Type: L8");
899
					break;
900
901
					case 'NOOP':
902
						ftp_Tell(200, "NOOP command successful");
903
					break;
904
905
					case 'USER':
906
					case 'PASS':
907
						ftp_Tell(530, "User '$FTP->user' already logged in");
908
					break;
909
910
					default:
911
						ftp_Tell(500, "Function $cmd not implemented (yet).");
912
					break;
913
				}
914
				$last_cmd = $cmd;
915
			}
916
		}
917
918
		function ftp_CheckLogin() {
919
		global $FTP, $AR, $ARLogin, $ARPassword;
920
921
			while (!$AR->user) {
922
				ftp_FetchCMD($cmd, $args);
923
				if ($cmd==="USER") {
924
					$login=$args;
925
					ftp_Tell(331, "Password required for '$login'");
926
					ftp_FetchCMD($cmd, $args);
927
					if ($cmd=="PASS") {
928
						$password=$args;
929
						debug("ftp: auth ($login, $password)");
930
931
						$criteria="object.implements = 'puser'";
932
						$criteria.=" and login.value = '".AddSlashes($login)."'";
933
						$user=$FTP->store->call("system.get.phtml", "",
934
												$FTP->store->find("/system/users/",
935
																$criteria));
936
						$user=$user[0];
937
938
						if ($user) {
939
							debug("ftp: found user");
940
							$ARLogin=$login;
941
							$ARPassword=$password;
942
943
							if ($user->CheckPassword($password)) {
944
								$AR->user=$user;
945
								if ($user->data->login!="admin") {
946
									$AR->user->grants[$AR->user->path]=$AR->user->GetValidGrants();
947
								}
948
949
								$siteroot = current($FTP->store->call("system.get.phtml", "", $FTP->store->get($FTP->site."/")));
950
951
								if ($AR->user->data->login==="admin" || $siteroot->CheckLogin("ftp")) {
952
									$FTP->cwd="/";
953
									$FTP->user=$login;
954
								} else {
955
									ftp_Tell(530, "Login incorrect: (site) permission denied");
956
									unset($user);
957
									unset($AR->user);
958
								}
959
960
							} else {
961
								ftp_Tell(530, "Login incorrect: password incorrect");
962
							}
963
						} else {
964
							ftp_Tell(530, "Login incorrect: user '$login' not found ");
965
						}
966
					} else {
967
						ftp_Tell(530, "Please login with USER and PASS.");
968
					}
969
				} else {
970
					ftp_Tell(530, "Please login with USER and PASS.");
971
				}
972
			}
973
			ftp_Tell(230, "User '".$FTP->user."' logged in at $FTP->cwd ");
974
		}
975
976
		function ftp_FetchCMD(&$cmd, &$args) {
977
		global $FTP;
978
			$cmd = "";
979
			do {
980
				$data=fgets($FTP->stdin, 2000);
981
				debug("ftp: client:: '$data'");
982
				if (preg_match('/^([a-z]+)([[:space:]]+(.*))?/i', $data, $regs)) {
983
					$cmd=strtoupper($regs[1]);
984
					$args=chop($regs[3]);
985
					debug("ftp: cmd ($cmd) arg ($args)");
986
				}
987
			} while (!$cmd);
988
			return $cmd;
989
		}
990
991
		function ftp_Tell($code, $msg) {
992
		global $FTP;
993
			if (is_array($msg)) {
994
				fputs($FTP->stdout, "$code-".$msg[0]."\n");
995
				next($msg);
996
				while (list(,$line)=each($msg)) {
997
					fputs($FTP->stdout, $line."\r\n");
998
					debug($line);
999
				}
1000
			} else {
1001
				fputs($FTP->stdout, "$code $msg\n");
1002
				debug("$code $msg\n");
1003
			}
1004
			fflush($FTP->stdout);
1005
		}
1006
1007
		function ftp_GenListEntry($entry) {
1008
		global $AR;
1009
1010
			$user=$AR->user->data->login;
1011
			$grants=$entry["grants"];
1012
1013
			if ($entry["filename"]) {
1014
				$file=$entry["filename"];
1015
			} else {
1016
				$file=substr($entry["path"], strrpos(substr($entry["path"], 0, -1), "/")+1);
1017
			}
1018
1019
			if ($entry["type"]==="dir") {
1020
				$data.="d";
0 ignored issues
show
The variable $data does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
1021 View Code Duplication
				if ($file[strlen($file)-1]==='/') {
1022
					$file=substr($file, 0, -1);
1023
				}
1024
			} else if ($entry["type"]==="shortcut") {
1025
				$data.="l";
1026 View Code Duplication
				if ($file[strlen($file)-1]==='/') {
1027
					$file=substr($file, 0, -1);
1028
				}
1029
				$file=$file." -> ";
1030
				$file.=$entry["target"];
1031
			} else if ($entry["type"]==="template") {
1032
				$data.="-";
1033
			} else {
1034
				$data.="-";
1035
				$file=substr($file, 0, -1);
1036
			}
1037
1038
			if ($grants["read"]) {
1039
				$data.="r";
1040
			} else {
1041
				$data.="-";
1042
			}
1043
			if ($grants["write"]) {
1044
1045
				$data.="w";
1046
			} else {
1047
				$data.="-";
1048
			}
1049
			if (($entry["type"]==="dir" || $entry["type"]==="shortcut") && $grants["read"]) {
1050
				$data.="x";
1051
			} else {
1052
				$data.="-";
1053
			}
1054
1055
			// 'group' grants are identical to user grants
1056
			// and we don't give public any grants
1057
			$data.=substr($data, 1);
1058
			$data.="---";
1059
1060
			$data.="   1 "; // we just say this directory contains 1 child
1061
1062
			$user = substr($user, 0, 9);
1063
			$userentry = $user.substr("         ", strlen($user));
1064
			$data.=$userentry.$userentry;
1065
1066
			$size = substr($entry["size"], 0, 8);
1067
			$sizeentry = substr("        ", strlen($size)).$size;
1068
			$data.=$sizeentry;
1069
1070
			$date=substr(date("M d h:i", $entry["date"]), 0, 12);
1071
			$dateentry = substr("            ", strlen($date)).$date;
1072
			$data.=" ".$dateentry;
1073
1074
			$data.=" ".$file;
1075
1076
			$data.="\n";
1077
			debug($data);
1078
			return $data;
1079
		}
1080
1081
1082
//	debugon("pinp");
1083
1084
	// set PHP error handling
1085
	error_reporting(1);
1086
	set_error_handler("ftp_ErrorHandler");
1087
	error_reporting(1);
1088
	set_time_limit(0);
1089
1090
	$FTP = new stdClass;
1091
	$inst_store = $store_config["dbms"]."store";
1092
	$store=new $inst_store("", $store_config);
1093
1094
	// fill in your own server ip number:
1095
	$FTP->server_ip = $ftp_config["server_ip"];
1096
	$FTP->host = $ftp_config["site"];
1097
	$FTP->store = &$store;
1098
	// default listMode ( files, objects or templates )
1099
	$listMode = $ftp_config["defaultListMode"];
1100
	if (!$listMode) {
1101
		$listMode = "files";
1102
	}
1103
	$FTP->defaultListMode = $listMode;
1104
	$FTP->symlinkListModes = $ftp_config["symlinkListModes"];
1105
1106
	// default type is ASCII
1107
	$FTP->DC["type"] = "A";
1108
1109
	ob_start("debug");
1110
	$FTP->stdin=fopen("php://stdin", "r");
1111
	if ($FTP->stdin) {
1112
		$FTP->stdout=fopen("php://stdout", "w");
1113
		if ($FTP->stdout) {
1114
1115
			$FTP->site=substr($ftp_config["root"],0, -1);
1116
			$FTP->cwd="/";
1117
			ftp_Tell(220, $ftp_config["greeting"]);
1118
1119
			ftp_CheckLogin();
1120
			ftp_Run();
1121
1122
		} else {
1123
			fclose($FTP->stdin);
1124
			$FTP->error="Could not open stdout";
1125
		}
1126
	} else {
1127
		$FTP->error="Could not open stdin";
1128
	}
1129