www: Improve error handling for file uploads
This commit is contained in:
		@@ -208,17 +208,26 @@ foreach ($clients as $c) {
 | 
				
			|||||||
        header("Content-Length: $size");
 | 
					        header("Content-Length: $size");
 | 
				
			||||||
        readfile($path);
 | 
					        readfile($path);
 | 
				
			||||||
    } else if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
 | 
					    } else if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
 | 
				
			||||||
        $putdata = fopen('php://input', 'r');
 | 
					        $upload = fopen("php://input", "r");
 | 
				
			||||||
        $fp = fopen($path, 'wb');
 | 
					        $fp = fopen("/tmp/upload-$file", "wb+");
 | 
				
			||||||
        if ($fp === false) {
 | 
					        if (!$upload || !$fp) {
 | 
				
			||||||
            header("Status: 500");
 | 
					            fclose($fp);
 | 
				
			||||||
            header("Content-Length: 26");
 | 
					            fclose($upload);
 | 
				
			||||||
 | 
					            header('Status: 500');
 | 
				
			||||||
 | 
					            header('Content-Length: 26');
 | 
				
			||||||
            exit("500 Internal Server Error\n");
 | 
					            exit("500 Internal Server Error\n");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        while ($data = fread($putdata, 4096))
 | 
					
 | 
				
			||||||
            fwrite($fp, $data);
 | 
					        while ($data = fread($upload, 4096)) fwrite($fp, $data);
 | 
				
			||||||
        fclose($fp);
 | 
					        fclose($fp);
 | 
				
			||||||
        fclose($putdata);
 | 
					        fclose($upload);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!rename("/tmp/upload-$file", $path)) {
 | 
				
			||||||
 | 
					            header('Status: 500');
 | 
				
			||||||
 | 
					            header('Content-Length: 26');
 | 
				
			||||||
 | 
					            exit("500 Internal Server Error\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        header("Status: 201");
 | 
					        header("Status: 201");
 | 
				
			||||||
        header('Content-Length: 12');
 | 
					        header('Content-Length: 12');
 | 
				
			||||||
        exit("201 Created\n");
 | 
					        exit("201 Created\n");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,22 +5,40 @@ require "../.php/auth.inc";
 | 
				
			|||||||
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
 | 
					if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
 | 
				
			||||||
    authenticate();
 | 
					    authenticate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    header('Content-Type: text/plain; charset=UTF-8');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $name = substr($_SERVER['PATH_INFO'], 1);
 | 
					    $name = substr($_SERVER['PATH_INFO'], 1);
 | 
				
			||||||
    if (str_contains($name, "..") || str_contains($name, "/")) {
 | 
					    if (str_contains($name, "..") || str_contains($name, "/")) {
 | 
				
			||||||
        header('Status: 403');
 | 
					        header('Status: 403');
 | 
				
			||||||
        header('Content-Type: text/plain; charset=UTF-8');
 | 
					 | 
				
			||||||
        header('Content-Length: 14');
 | 
					        header('Content-Length: 14');
 | 
				
			||||||
        exit("403 Forbidden\n");
 | 
					        exit("403 Forbidden\n");
 | 
				
			||||||
 | 
					    } else if (!isset($_SERVER['HTTP_CONTENT_LENGTH'])) {
 | 
				
			||||||
 | 
					        header('Status: 411');
 | 
				
			||||||
 | 
					        header('Content-Length: 20');
 | 
				
			||||||
 | 
					        exit("411 Length Required\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $upload = fopen("php://input", "r");
 | 
					    $upload = fopen("php://input", "r");
 | 
				
			||||||
    $fp = fopen($name, "wb+");
 | 
					    $fp = fopen("/tmp/upload-$name", "wb+");
 | 
				
			||||||
 | 
					    if (!$upload || !$fp) {
 | 
				
			||||||
 | 
					        fclose($fp);
 | 
				
			||||||
 | 
					        fclose($upload);
 | 
				
			||||||
 | 
					        header('Status: 500');
 | 
				
			||||||
 | 
					        header('Content-Length: 26');
 | 
				
			||||||
 | 
					        exit("500 Internal Server Error\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    while ($data = fread($upload, 4096)) fwrite($fp, $data);
 | 
					    while ($data = fread($upload, 4096)) fwrite($fp, $data);
 | 
				
			||||||
    fclose($fp);
 | 
					    fclose($fp);
 | 
				
			||||||
    fclose($upload);
 | 
					    fclose($upload);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!rename("/tmp/upload-$name", $name)) {
 | 
				
			||||||
 | 
					        header('Status: 500');
 | 
				
			||||||
 | 
					        header('Content-Length: 26');
 | 
				
			||||||
 | 
					        exit("500 Internal Server Error\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    header('Status: 201');
 | 
					    header('Status: 201');
 | 
				
			||||||
    header('Content-Type: text/plain; charset=UTF-8');
 | 
					 | 
				
			||||||
    header('Content-Length: 12');
 | 
					    header('Content-Length: 12');
 | 
				
			||||||
    exit("201 Created\n");
 | 
					    exit("201 Created\n");
 | 
				
			||||||
} else if ($_SERVER['REQUEST_METHOD'] !== 'GET' && $_SERVER['REQUEST_METHOD'] !== 'HEAD') {
 | 
					} else if ($_SERVER['REQUEST_METHOD'] !== 'GET' && $_SERVER['REQUEST_METHOD'] !== 'HEAD') {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user