98 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
| <?php
 | |
| 
 | |
| /**
 | |
|  * class Settings
 | |
|  *
 | |
|  * Handles editing and fetching jilo configuration.
 | |
|  */
 | |
| class Settings {
 | |
| 
 | |
|     /**
 | |
|      * Loads javascript file the Jitsi server.
 | |
|      *
 | |
|      * @param string $jitsiUrl The base URL of the Jitsi server.
 | |
|      * @param string $livejsFile The name of the remote js file to load.
 | |
|      * @param bool $raw Whether to return the full file (true) or only uncommented values (false).
 | |
|      *
 | |
|      * @return string The content of the interface_config.js file or an error message.
 | |
|      */
 | |
|     public function getPlatformJsFile($jitsiUrl, $livejsFile, $raw = false) {
 | |
|         // constructing the URL
 | |
|         $jsFile = $jitsiUrl . '/' . $livejsFile;
 | |
| 
 | |
|         // default content, if we can't get the file contents
 | |
|         $jsFileContent = "The file $livejsFile can't be loaded.";
 | |
| 
 | |
|         // Check if URL is valid
 | |
|         if (!filter_var($jsFile, FILTER_VALIDATE_URL)) {
 | |
|             return "Invalid URL: $jsFile";
 | |
|         }
 | |
| 
 | |
|         // ssl options
 | |
|         $contextOptions = [
 | |
|             'ssl' => [
 | |
|                 'verify_peer'		=> true,
 | |
|                 'verify_peer_name'	=> true,
 | |
|             ],
 | |
|         ];
 | |
|         $context = stream_context_create($contextOptions);
 | |
| 
 | |
|         // Try to get headers first to check if file exists and wasn't redirected
 | |
|         $headers = @get_headers($jsFile, 1);  // 1 to get headers as array
 | |
|         if ($headers === false) {
 | |
|             return "The file $livejsFile can't be loaded (connection error).";
 | |
|         }
 | |
| 
 | |
|         // Check for redirects
 | |
|         $statusLine = $headers[0];
 | |
|         if (strpos($statusLine, '301') !== false || strpos($statusLine, '302') !== false) {
 | |
|             return "The file $livejsFile was redirected - this might indicate the file doesn't exist.";
 | |
|         }
 | |
| 
 | |
|         // Check if we got 200 OK
 | |
|         if (strpos($statusLine, '200') === false) {
 | |
|             return "The file $livejsFile can't be loaded (HTTP error: $statusLine).";
 | |
|         }
 | |
| 
 | |
|         // Check content type
 | |
|         $contentType = isset($headers['Content-Type']) ? $headers['Content-Type'] : '';
 | |
|         if (is_array($contentType)) {
 | |
|             $contentType = end($contentType); // get last content-type in case of redirects
 | |
|         }
 | |
|         if (stripos($contentType, 'javascript') === false && stripos($contentType, 'text/plain') === false) {
 | |
|             return "The file $livejsFile doesn't appear to be a JavaScript file (got $contentType).";
 | |
|         }
 | |
| 
 | |
|         // get the file
 | |
|         $fileContent = @file_get_contents($jsFile, false, $context);
 | |
| 
 | |
|         if ($fileContent !== false) {
 | |
|             // Quick validation of content
 | |
|             $firstLine = strtolower(trim(substr($fileContent, 0, 100)));
 | |
|             if (strpos($firstLine, '<!doctype html>') !== false || 
 | |
|                 strpos($firstLine, '<html') !== false || 
 | |
|                 strpos($firstLine, '<?xml') !== false) {
 | |
|                 return "The file $livejsFile appears to be HTML/XML content instead of JavaScript.";
 | |
|             }
 | |
| 
 | |
|             // when we need only uncommented values
 | |
|             if ($raw === false) {
 | |
|                 // remove block comments
 | |
|                 $jsFileContent = preg_replace('!/\*.*?\*/!s', '', $fileContent);
 | |
|                 // remove single-line comments
 | |
|                 $jsFileContent = preg_replace('/\/\/[^\n]*/', '', $jsFileContent);
 | |
|                 // remove empty lines
 | |
|                 $jsFileContent = preg_replace('/^\s*[\r\n]/m', '', $jsFileContent);
 | |
| 
 | |
|             // when we need the full file as it is
 | |
|             } else {
 | |
|                 $jsFileContent = $fileContent;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $jsFileContent;
 | |
| 
 | |
|     }
 | |
| 
 | |
| }
 |