Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP 8.1 and 8.2 support: my set of patches #306

Open
VVD opened this issue Jun 15, 2022 · 11 comments
Open

PHP 8.1 and 8.2 support: my set of patches #306

VVD opened this issue Jun 15, 2022 · 11 comments

Comments

@VVD
Copy link

VVD commented Jun 15, 2022

It's set consist from several my patches and several from various sources.

--- endpoints/api.php.orig	2024-06-07 15:46:20 UTC
+++ endpoints/api.php
@@ -334,6 +334,9 @@ try {
 
 	// Just append to $vbox->errors and let it get
 	// taken care of below
+	if(!isset($vbox)) {
+		$vbox = new stdClass();
+	}
 	if(!$vbox || !$vbox->errors) {
 		$vbox->errors = array();
 	}
@@ -342,7 +345,7 @@ try {
 
 
 // Add any messages
-if($vbox && count($vbox->messages)) {
+if($vbox && isset($vbox->messages)?count($vbox->messages):false) {
 	foreach($vbox->messages as $m)
 		$response['messages'][] = 'vboxconnector('.$request['fn'] .'): ' . $m;
 }
@@ -360,7 +363,7 @@ if($vbox && $vbox->errors) {
 		if($e->getCode() == vboxconnector::PHPVB_ERRNO_CONNECT && isset($vbox->settings))
 			$d .= "\n\nLocation:" . $vbox->settings->location;
 
-		$response['messages'][] = htmlentities($e->getMessage()).' ' . htmlentities($details);
+		$response['messages'][] = htmlentities($e->getMessage()). htmlentities(' '. $details);
 
 		$response['errors'][] = array(
 			'error'=> ($e->getCode() & vboxconnector::PHPVB_ERRNO_HTML ? $e->getMessage() : htmlentities($e->getMessage())),
--- endpoints/jqueryFileTree.php.orig	2024-06-07 15:46:20 UTC
+++ endpoints/jqueryFileTree.php
@@ -223,6 +223,8 @@ function getdir($dir, $dirsOnly=false, $recurse=array(
  */
 function getdir($dir, $dirsOnly=false, $recurse=array()) {
 
+	global $allowed_exts;
+
 	if(!$dir) $dir = DSEP;
 
 	$entries = getDirEntries($dir, $dirsOnly);
@@ -251,9 +253,9 @@ function getdir($dir, $dirsOnly=false, $recurse=array(
         	// Push file on to stack
         	} else {
 
-        		$ext = strtolower(preg_replace('/^.*\./', '', $file));
+        		$ext = strtolower(preg_replace('/^.*\./', '', $path));
 
-                if(count($allowed) && !$allowed['.'.$ext]) continue;
+                if(count($allowed_exts) && !$allowed_exts['.'.$ext]) continue;
 
                 array_push($dirents, file_entry($path));
         	}
--- endpoints/lib/config.php.orig	2024-06-07 15:46:20 UTC
+++ endpoints/lib/config.php
@@ -141,6 +141,10 @@ class phpVBoxConfigClass {
 	 */
 	var $eventListenerTimeout = 20;
 
+	var $enableHDFlushConfig = false;
+
+	var $authMaster = false;
+
 	/**
 	 * Read user configuration, apply defaults, and do some sanity checking
 	 * @see vboxconnector
--- endpoints/lib/language.php.orig	2024-06-07 15:46:20 UTC
+++ endpoints/lib/language.php
@@ -73,6 +73,8 @@ class __vbox_language {
 		$xmlObj = simplexml_load_string(@file_get_contents(VBOX_BASE_LANG_DIR.'/'.$lang.'.xml'));
 		$arrXml = $this->objectsIntoArray($xmlObj);
 
+		if(!array_key_exists('context',$arrXml)) return;
+
 		$lang = array();
 		if(!@$arrXml['context'][0]) $arrXml['context'] = array($arrXml['context']);
 		foreach($arrXml['context'] as $c) {
--- endpoints/lib/vboxServiceWrappers.php.orig	2024-06-07 15:46:20 UTC
+++ endpoints/lib/vboxServiceWrappers.php
@@ -108,7 +108,7 @@ abstract class VBox_Collection implements ArrayAccess,
     }
 
     /** ArrayAccess Functions **/
-    public function offsetSet($offset, $value)
+    public function offsetSet($offset, $value): void
     {
         if ($value instanceof $this->_interfaceName)
         {
@@ -127,49 +127,50 @@ abstract class VBox_Collection implements ArrayAccess,
         }
     }
 
-    public function offsetExists($offset)
+    public function offsetExists($offset): bool
     {
         return isset($this->_objects[$offset]);
     }
 
-    public function offsetUnset($offset)
+    public function offsetUnset($offset): void
     {
         unset($this->_objects[$offset]);
     }
 
-    public function offsetGet($offset)
+    public function offsetGet($offset): mixed
     {
         return isset($this->_objects[$offset]) ? $this->_objects[$offset] : null;
     }
 
     /** Iterator Functions **/
-    public function rewind()
+    public function rewind(): void
     {
         reset($this->_objects);
     }
 
-    public function current()
+    public function current(): mixed
     {
         return current($this->_objects);
     }
 
-    public function key()
+    public function key(): mixed
     {
         return key($this->_objects);
     }
 
+    #[\ReturnTypeWillChange]
     public function next()
     {
         return next($this->_objects);
     }
 
-    public function valid()
+    public function valid(): bool
     {
         return ($this->current() !== false);
     }
 
     /** Countable Functions **/
-    public function count()
+    public function count(): int
     {
         return count($this->_objects);
     }
--- endpoints/lib/vboxconnector.php.orig	2024-06-07 15:46:20 UTC
+++ endpoints/lib/vboxconnector.php
@@ -112,6 +112,8 @@ class vboxconnector {
 	 */
 	var $dsep = null;
 
+	var $client = null;
+
 	/**
 	 * Obtain configuration settings and set object vars
 	 * @param boolean $useAuthMaster use the authentication master obtained from configuration class
@@ -387,7 +389,8 @@ class vboxconnector {
 
 			// The amount of time we will wait for events is determined by
 			// the amount of listeners - at least half a second
-			$listenerWait = max(100,intval(500/count($this->persistentRequest['vboxEventListeners'])));
+			$listenerCount = count($this->persistentRequest['vboxEventListeners']);
+			$listenerWait = max(100,intval(500/($listenerCount > 0 ? $listenerCount : 1)));
 		}
 
 		// Get events from each configured event listener
@@ -5660,11 +5663,6 @@ class vboxconnector {
 			}
 		} catch (Exception $null) {}
 		$m->releaseRemote();
-
-		// Attempt to UTF-8 encode string or json_encode may choke
-		// and return an empty string
-		if(function_exists('utf8_encode'))
-			return utf8_encode($log);
 
 		return $log;
 	}
--- endpoints/screen.php.orig	2024-06-07 15:46:20 UTC
+++ endpoints/screen.php
@@ -87,13 +87,13 @@ try {
 
 		// Let the browser cache images for 3 seconds
 		$ctime = 0;
-		if(strpos($_SERVER['HTTP_IF_NONE_MATCH'],'_')) {
-			$ctime = preg_replace("/.*_/",str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']));
-		} else if(strpos($_ENV['HTTP_IF_NONE_MATCH'],'_')) {
-			$ctime = preg_replace("/.*_/",str_replace('"','',$_ENV['HTTP_IF_NONE_MATCH']));
-		} else if(strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'],'GMT')) {
+		if(strpos($_SERVER['HTTP_IF_NONE_MATCH'] ?? '','_')) {
+			$ctime = preg_replace("/.*_/","",str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']));
+		} else if(strpos($_ENV['HTTP_IF_NONE_MATCH'] ?? '','_')) {
+			$ctime = preg_replace("/.*_/","",str_replace('"','',$_ENV['HTTP_IF_NONE_MATCH']));
+		} else if(strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'] ?? '','GMT')) {
 			$ctime = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
-		} else if(strpos($_ENV['HTTP_IF_MODIFIED_SINCE'],'GMT')) {
+		} else if(strpos($_ENV['HTTP_IF_MODIFIED_SINCE'] ?? '','GMT')) {
 			$ctime = strtotime($_ENV['HTTP_IF_MODIFIED_SINCE']);
 		}
 		
@@ -164,13 +164,13 @@ try {
 
 		// Let the browser cache saved state images
 		$ctime = 0;
-		if(strpos($_SERVER['HTTP_IF_NONE_MATCH'],'_')) {
-			$ctime = preg_replace("/.*_/",str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']));
-		} else if(strpos($_ENV['HTTP_IF_NONE_MATCH'],'_')) {
-			$ctime = preg_replace("/.*_/",str_replace('"','',$_ENV['HTTP_IF_NONE_MATCH']));
-		} else if(strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'],'GMT')) {
+		if(strpos($_SERVER['HTTP_IF_NONE_MATCH'] ?? '','_')) {
+			$ctime = preg_replace("/.*_/","",str_replace('"','',$_SERVER['HTTP_IF_NONE_MATCH']));
+		} else if(strpos($_ENV['HTTP_IF_NONE_MATCH'] ?? '','_')) {
+			$ctime = preg_replace("/.*_/","",str_replace('"','',$_ENV['HTTP_IF_NONE_MATCH']));
+		} else if(strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'] ?? '','GMT')) {
 			$ctime = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
-		} else if(strpos($_ENV['HTTP_IF_MODIFIED_SINCE'],'GMT')) {
+		} else if(strpos($_ENV['HTTP_IF_MODIFIED_SINCE'] ?? '','GMT')) {
 			$ctime = strtotime($_ENV['HTTP_IF_MODIFIED_SINCE']);
 		}
 		
--- panes/settingsDisplay.html.orig	2024-06-07 15:46:20 UTC
+++ panes/settingsDisplay.html
@@ -77,9 +77,9 @@ -->
 		<th><span class='translate'>Authentication Method:</span></th>
 		<td>
              <select name='vboxSettingsDisplayVRDEAuth' id='vboxSettingsDisplayVRDEAuthID' style='width: 100%'>
-              <option value='' >None</option>
-				<option value='External'>External</option>
-				<option value='Guest'>Guest</option>
+              <option value='Null'>None</option>
+              <option value='External'>External</option>
+              <option value='Guest'>Guest</option>
              </select>
           </td>
 	</tr>
--- panes/settingsNetwork.html.orig	2024-06-07 15:46:20 UTC
+++ panes/settingsNetwork.html
@@ -320,7 +320,7 @@ function vboxSettingsUpdateNetworkOptions(sel) {
 	}
 
 	// Special case for Internal, Generic, and VDE network selects
-	if(sel.value == 'Internal' || sel.value == 'VDE' || sel.value == 'Generic' || sel.value == 'Bridged') {
+	if(sel.value == 'Internal' || sel.value == 'VDE' || sel.value == 'Generic') {
 		$(nsel).jec();
 	}
 	

Is there an active commiter?
Or maybe somebody can fork and become upstream?
I can't - don't know PHP and JS.

@VVD
Copy link
Author

VVD commented Jun 20, 2022

v2: added patch for endpoints/screen.php - without it can't see preview and screenshots.

@zoon01
Copy link

zoon01 commented Jun 23, 2022

thanks for patches, confirm working on PHP8.1

@BartekSz95
Copy link

BartekSz95 commented Jul 29, 2022

Fixed version with PHP8.1 compatibility:
https://github.com/BartekSz95/phpvirtualbox_vbox61_php81

@VVD
Copy link
Author

VVD commented Aug 13, 2022

Fixed version with PHP8.1 compatibility: https://github.com/BartekSz95/phpvirtualbox_vbox61_php81

@BartekSz95, do you want to become new upstream for the phpvirtualbox?

@nc52net
Copy link

nc52net commented Aug 18, 2022

I have tried the fixed version but am still getting an unknown php error on Fedora 36. There are no errors in the httpd or php-fmp directories in var log and onthe the below in the httpd access log
10.191.253.76 - - [18/Aug/2022:18:24:49 +0100] "GET /z/endpoints/language.php?_=1660840637173 HTTP/1.1" 200 3407 "http://10.191.253.200/z/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"

Attached config.php
config.php.txt

any ideas?

@trasherdk
Copy link

Stuff like this can be debugged easily with xdebug PHP extension and VS Code.

@Fjox
Copy link

Fjox commented May 25, 2023

how do i implement this?

@VVD
Copy link
Author

VVD commented Sep 17, 2023

Fixed screen.php near preg_replace.

@VVD VVD changed the title PHP 8.1 support: my set of patches PHP 8.1 and 8.2 support: my set of patches Dec 2, 2023
@VVD
Copy link
Author

VVD commented Dec 2, 2023

Fixed endpoints/lib/config.php and endpoints/lib/vboxconnector.php:

Deprecated:  Creation of dynamic property vboxconnector::$client is deprecated in /usr/local/www/phpvirtualbox/endpoints/lib/vboxconnector.php on line 175
Deprecated:  Creation of dynamic property phpVBoxConfigClass::$enableHDFlushConfig is deprecated in /usr/local/www/phpvirtualbox/endpoints/lib/config.php on line 1825
Deprecated:  Creation of dynamic property phpVBoxConfigClass::$authMaster is deprecated in /usr/local/www/phpvirtualbox/endpoints/lib/config.php on line 241

@VVD
Copy link
Author

VVD commented Dec 9, 2023

Fixed in endpoints/lib/vboxconnector.php division by zero error.

@VVD
Copy link
Author

VVD commented Jul 14, 2024

"Show Log" for a VM failed with error: "Function utf8_encode() is deprecated".
It's deprecated since PHP 8.2 and will be removed in PHP 9.
There is little sense in encoding logs - remove it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants