Compare commits
	
		
			21 Commits
		
	
	
		
			1.1.8
			...
			cb07365020
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| cb07365020 | |||
| 46cf0f1f4e | |||
| 5a0d96b6c6 | |||
| c0c8a43c77 | |||
| a91c21ecfd | |||
| 49f466f298 | |||
| f0171a0232 | |||
| c95880d22f | |||
| 2f99a07ef7 | |||
| 97f62b8ee8 | |||
| 198a83b4c7 | |||
| 803e7185d8 | |||
| 30361a9aae | |||
| 115e8367da | |||
| 0d61dd1725 | |||
| d7147b6c81 | |||
| 63ec0ebaa8 | |||
| f925665d23 | |||
| a1aa1c0d14 | |||
| ff97952f67 | |||
| f0ce402830 | 
							
								
								
									
										114
									
								
								common.js
									
									
									
									
									
								
							
							
						
						| @@ -110,29 +110,35 @@ function check_vpn() { | |||||||
|   var url  = 'scan.php?op=check_vpn'; |   var url  = 'scan.php?op=check_vpn'; | ||||||
|   jQuery.get(url, function(data) { |   jQuery.get(url, function(data) { | ||||||
|         console.log('check_vpn: '+data); |         console.log('check_vpn: '+data); | ||||||
|         if (data=="1") { // save_vpn has finished |         if (data=="1") { // save_vpn has finished or VPN ON | ||||||
| 	  const vpn_div = document.getElementById("vpn"); | 	  const vpn_div = document.getElementById("vpn"); | ||||||
| 	  console.log(vpn_div); | 	  console.log('vpn_div: '+vpn_div); | ||||||
| 	  if (vpn_div) { | 	  if (vpn_div) { | ||||||
| 	  	vpn_div.innerHTML = 'VPN start process has finished'; | 	  	vpn_div.innerHTML = 'VPN start process has finished'; | ||||||
| 		//document.getElementById('installAppsBtn').click(); | 		setTimeout(function() { | ||||||
|  | 			document.getElementById('installAppsBtn').click(); | ||||||
|  | 		}, 2000); | ||||||
|  | 	  } | ||||||
|  | 	  else { | ||||||
|  | 		$('#pro_off').hide(); | ||||||
|  | 		$('#pro_on').show(); | ||||||
|  | 		$('#vpn_off').hide(); | ||||||
|  | 		$('#vpn_on').show(); | ||||||
|  | 		//document.getElementById('vpnToggle').checked = true; | ||||||
|  | 		//document.querySelector(".switch-label").textContent = "ON"; | ||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
| 	else if (data=="2") { | 	else if (data=="2") { | ||||||
| 		document.getElementById('vpnToggle').checked = true; | 		$('#pro_off').hide(); | ||||||
|   		document.querySelector(".switch-label").textContent = "ON"; | 		$('#pro_on').show(); | ||||||
|           $('#vpn_off').hide(); | 		$('#vpn_on').hide(); | ||||||
|           $('#vpn_on').show(); | 		$('#vpn_off').show(); | ||||||
|           $('#pro_off').hide(); | 		//document.getElementById('vpnToggle').checked = false; | ||||||
|           $('#pro_on').show(); | 		//document.querySelector(".switch-label").textContent = "OFF"; | ||||||
|         } |         } | ||||||
|         else { |         else { // data == 0 | ||||||
| 		document.getElementById('vpnToggle').checked = false; | 		$('#pro_on').hide(); | ||||||
|   		document.querySelector(".switch-label").textContent = "OFF"; | 		$('#pro_off').show(); | ||||||
|           $('#vpn_on').hide(); |  | ||||||
|           $('#vpn_off').show(); |  | ||||||
|           $('#pro_on').hide(); |  | ||||||
|           $('#pro_off').show(); |  | ||||||
|         } |         } | ||||||
|         setTimeout(check_vpn, 10000); |         setTimeout(check_vpn, 10000); | ||||||
|   }); |   }); | ||||||
| @@ -211,7 +217,8 @@ function load_template(additional, block) { | |||||||
|   jQuery("div.deployment").each(function(index) { |   jQuery("div.deployment").each(function(index) { | ||||||
|         $(this).html(''); |         $(this).html(''); | ||||||
|   }); |   }); | ||||||
|   jQuery("#"+block).html('Loading '+additional+' template...'); |   //jQuery("#"+block).html('Loading '+additional+' template...'); | ||||||
|  |   jQuery("#"+block).html('<div class="loading">Loading...</div>'); | ||||||
|   var url  = 'scan.php?op=deployment&additional='+additional; |   var url  = 'scan.php?op=deployment&additional='+additional; | ||||||
|   jQuery.get(url, function(data) { |   jQuery.get(url, function(data) { | ||||||
| 	console.log('load_template: '+data); | 	console.log('load_template: '+data); | ||||||
| @@ -237,7 +244,8 @@ function reinstall(additional, block) { | |||||||
|   jQuery("div.deployment").each(function(index) { |   jQuery("div.deployment").each(function(index) { | ||||||
|         $(this).html(''); |         $(this).html(''); | ||||||
|   }); |   }); | ||||||
|   jQuery("#"+block).html('Loading '+additional+' template...'); |   //jQuery("#"+block).html('Loading '+additional+' template...'); | ||||||
|  |   jQuery("#"+block).html('<div class="loading">Loading...</div>'); | ||||||
|   var url  = 'scan.php?op=reinstall&additional='+additional; |   var url  = 'scan.php?op=reinstall&additional='+additional; | ||||||
|   jQuery.get(url, function(data) { |   jQuery.get(url, function(data) { | ||||||
| 	console.log('reinstall '+additional+': '+data); | 	console.log('reinstall '+additional+': '+data); | ||||||
| @@ -271,14 +279,14 @@ function uninstall(additional) { | |||||||
|   jQuery("div.deployment").each(function(index) { |   jQuery("div.deployment").each(function(index) { | ||||||
|         $(this).html(''); |         $(this).html(''); | ||||||
|   }); |   }); | ||||||
| 	data = '<fieldset><form action="#" method="post"><div class="row">YOU ARE GOING TO UNINSTALL '+additional.toUpperCase()+'.<br>ARE YOU SURE? IF YES, PLEASE CLICK ON THE BUTTON BELOW.<br><br></div><div class="row"><div class="mb-3"><button class="btn btn-lg btn-primary btn-block" type="button" onclick="confirm_uninstall(\''+additional+'\')">Uninstall</button></div></div></form></fieldset>'; | 	data = '<form action="#" method="post"><div class="row">YOU ARE GOING TO UNINSTALL '+additional.toUpperCase()+'.<br>ARE YOU SURE? IF YES, PLEASE CLICK ON THE BUTTON BELOW.<br><br></div><div class="row"><div class="mb-3"><button class="save-button" type="button" onclick="confirm_uninstall(\''+additional+'\')">Uninstall</button></div></div></form>'; | ||||||
| 	jQuery("#"+additional).html(data); | 	jQuery("#"+additional).html(data); | ||||||
| 	jQuery("#popupText").html(data); // manage2 | 	jQuery("#popupText").html(data); // manage2 | ||||||
| } | } | ||||||
|  |  | ||||||
| function confirm_uninstall(additional) { | function confirm_uninstall(additional) { | ||||||
|   jQuery("#"+additional).html('Loading...'); |   jQuery("#"+additional).html('<div class="loading">Loading...</div>'); | ||||||
|   jQuery("#popupText").html('Loading'); // manage2 |   jQuery("#popupText").html('<div class="loading">Loading...</div>'); // manage2 | ||||||
|   var url  = 'scan.php?op=uninstall&additional='+additional; |   var url  = 'scan.php?op=uninstall&additional='+additional; | ||||||
|   jQuery.get(url, function(data) { |   jQuery.get(url, function(data) { | ||||||
|         console.log('uninstall '+additional+': '+data); |         console.log('uninstall '+additional+': '+data); | ||||||
| @@ -406,53 +414,52 @@ function get_services() { | |||||||
|  |  | ||||||
| function get_proxy_html() { | function get_proxy_html() { | ||||||
|         proxy_html = ` |         proxy_html = ` | ||||||
| 	<fieldset> |  | ||||||
| 	<legend>Enable proxy</legend> |  | ||||||
|         <div class="input-group"> |  | ||||||
| 	<form class="form-install" action="#" method="post" id="save_vpn"> | 	<form class="form-install" action="#" method="post" id="save_vpn"> | ||||||
|  |         <div class="app-fields"> | ||||||
|  |         	<div class="app-field"> | ||||||
| 		<div class="row"> | 		<div class="row"> | ||||||
| 		    <div class="mb-3"> | 			<label for="vpn_domain">Please add domain url to download the VPN hash from:</label> | ||||||
| 				<label for="vpn_domain">Please add domain url to download the VPN hash from (default: https://portal.safebox.network):</label> | 		    <div class="input-container"> | ||||||
| 				<input type="text" class="form-control" name="VPN_DOMAIN" id="vpn_domain" value="https://portal.safebox.network"> | 				<input type="text" class="form-control" name="VPN_DOMAIN" id="vpn_domain" value="https://portal.safebox.network" size="40"> | ||||||
| 				<div class="invalid-feedback"> |  | ||||||
| 				Please enter a valid domain. |  | ||||||
| 				</div> |  | ||||||
| 		    </div> | 		    </div> | ||||||
| 		</div> | 		</div> | ||||||
|  | 		</div> | ||||||
|  |         	<div class="app-field"> | ||||||
| 		<div class="row"> | 		<div class="row"> | ||||||
| 		    <div class="mb-3"> | 			<label for="vpn_pass">Please type in the generated VPN passkey (8 digits):</label> | ||||||
| 				<label for="vpn_pass">Please type in the generated VPN passkey (8 digits):</label> | 		    <div class="input-container"> | ||||||
| 				<input type="text" class="form-control" name="VPN_PASS" id="vpn_pass" value="" maxlength="8" size="10"> | 				<input type="text" class="form-control" name="VPN_PASS" id="vpn_pass" value="" maxlength="8" size="10"> | ||||||
| 		    </div> | 		    </div> | ||||||
| 		</div> | 		</div> | ||||||
|  | 		</div> | ||||||
|  |         	<div class="app-field"> | ||||||
| 		<div class="row"> | 		<div class="row"> | ||||||
| 		    <div class="mb-3"> | 			<label for="letsencrypt_mail">Please add the letsencrypt mail address:</label> | ||||||
| 				<label for="letsencrypt_mail">Please add the letsencrypt mail address:</label> | 		    <div class="input-container"> | ||||||
| 				<input type="email" class="form-control" name="LETSENCRYPT_MAIL" id="letsencrypt_mail" value=""> | 				<input type="email" class="form-control" name="LETSENCRYPT_MAIL" id="letsencrypt_mail" value=""> | ||||||
| 				<div class="invalid-feedback"> |  | ||||||
| 				Please enter a valid email. |  | ||||||
| 				</div> |  | ||||||
| 		    </div> | 		    </div> | ||||||
| 		</div> | 		</div> | ||||||
|  | 		</div> | ||||||
|  |         	<div class="app-field"> | ||||||
| 		<div class="row"> | 		<div class="row"> | ||||||
| 		    <div class="mb-3"> | 			<label for="letsencrypt_servername">Please add letsencrypt server name (default is letsencrypt but you can add zerossl too):</label> | ||||||
| 				<label for="letsencrypt_servername">Please add letsencrypt server name (default is letsencrypt but you can add zerossl too):</label> | 		    <div class="input-container"> | ||||||
| 				<input type="text" class="form-control" name="LETSENCRYPT_SERVERNAME" id="letsencrypt_servername" value="letsencrypt"> | 				<input type="text" class="form-control" name="LETSENCRYPT_SERVERNAME" id="letsencrypt_servername" value="letsencrypt"> | ||||||
| 		    </div> | 		    </div> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div class="row buttons"> |  | ||||||
| 		    <div class="mb-3"> |  | ||||||
| 			<button class="btn btn-lg btn-primary btn-block" type="button" id="vpn_save_btn"> Save </button> |  | ||||||
| 		    </div> |  | ||||||
| 		</div> | 		</div> | ||||||
| 	</form> |  | ||||||
| 	</div> | 	</div> | ||||||
| 	</fieldset> | 	<div class="row buttons"> | ||||||
|  | 	    <div class="mb-3"> | ||||||
|  | 		<button class="btn btn-lg btn-primary btn-block" type="button" id="vpn_save_btn"> Save </button> | ||||||
|  | 	    </div> | ||||||
|  | 	</div> | ||||||
|  | 	</form> | ||||||
| 	<script> | 	<script> | ||||||
| 	jQuery('#vpn_save_btn').click(function() { | 	jQuery('#vpn_save_btn').click(function() { | ||||||
| 		console.log('vpn save'); | 		console.log('vpn save'); | ||||||
| 		save_vpn(); | 		save_vpn(); | ||||||
| 		jQuery('#vpn').html('VPN start process in progress. Please wait...'); | 		jQuery('#vpn').html('<div class="loading">VPN start process in progress. Please wait...</div>'); | ||||||
| 	}); | 	}); | ||||||
| 	</script> | 	</script> | ||||||
|         `; |         `; | ||||||
| @@ -480,8 +487,17 @@ function get_containers() { | |||||||
|   }); |   }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function get_version() { | ||||||
|  |   var url  = 'scan.php?op=version'; | ||||||
|  |   jQuery.get(url, function(data) { | ||||||
|  | 	console.log('version: '+data); | ||||||
|  | 	jQuery('#logo').attr('title',data); | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
| jQuery(document).ready(function(){ | jQuery(document).ready(function(){ | ||||||
|  |  | ||||||
|  | 	get_version(); | ||||||
| 	get_repositories(); | 	get_repositories(); | ||||||
| 	get_deployments(); | 	get_deployments(); | ||||||
| 	get_system(); | 	get_system(); | ||||||
| @@ -514,19 +530,19 @@ jQuery(document).ready(function(){ | |||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
| 	jQuery('#update_btn').click(function() { | 	jQuery('#update_btn').click(function() { | ||||||
| 		jQuery('#updates').html('Looking for updates... Please wait...'); | 		jQuery('#updates').html('<div class="loading">Looking for updates...</div>'); | ||||||
| 		get_updates(); | 		get_updates(); | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
| 	jQuery('#add_repo').submit(function() { | 	jQuery('#add_repo').submit(function() { | ||||||
| 		jQuery('#repositories').html('Loading...'); | 		jQuery('#repositories').html('<div class="loading">Loading...</div>'); | ||||||
| 		add_repository(); | 		add_repository(); | ||||||
| 		return false; | 		return false; | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
| 	jQuery('#save_vpn').submit(function() { | 	jQuery('#save_vpn').submit(function() { | ||||||
| 		save_vpn(); | 		save_vpn(); | ||||||
| 		jQuery('#vpn').html('Loading...'); | 		jQuery('#vpn').html('<div class="loading">Loading...</div>'); | ||||||
| 		return false; | 		return false; | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								img/grey-box.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.1 KiB | 
							
								
								
									
										14
									
								
								img/logo.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 14 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/monitor.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 50 KiB | 
							
								
								
									
										
											BIN
										
									
								
								img/off.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 684 B After Width: | Height: | Size: 914 B | 
							
								
								
									
										
											BIN
										
									
								
								img/on.png
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 701 B After Width: | Height: | Size: 992 B | 
							
								
								
									
										
											BIN
										
									
								
								img/yellow-box.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										13
									
								
								index.html
									
									
									
									
									
								
							
							
						
						| @@ -3,21 +3,26 @@ | |||||||
| <head> | <head> | ||||||
| <meta charset="UTF-8"> | <meta charset="UTF-8"> | ||||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||||
|  | <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> | ||||||
|  | <meta http-equiv="Pragma" content="no-cache" /> | ||||||
|  | <meta http-equiv="Expires" content="0" /> | ||||||
| <title>Safebox installer</title> | <title>Safebox installer</title> | ||||||
| <style> | <style> | ||||||
| body, html { | html, body { | ||||||
|     margin: 0; |     margin: 0; | ||||||
|     padding: 0; |     padding: 0; | ||||||
|     height: 100%; |     height: 100%; | ||||||
|  |     overflow: hidden; | ||||||
| } | } | ||||||
| iframe { | iframe { | ||||||
|     width: 100%; |     display: block; | ||||||
|     height: 100%; |     width: 100vw; | ||||||
|  |     height: 100vh; | ||||||
|     border: none; |     border: none; | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
| </head> | </head> | ||||||
| <body> | <body> | ||||||
|     <iframe src="scan.html"></iframe> |     <iframe src="scan.html?t=1"></iframe> | ||||||
| </body> | </body> | ||||||
| </html> | </html> | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								install.html
									
									
									
									
									
								
							
							
						
						| @@ -1,18 +1,21 @@ | |||||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||||
| <html lang="hu"> | <html lang="hu"> | ||||||
| <head> | <head> | ||||||
|   <meta charset="UTF-8" /> | <meta charset="UTF-8" /> | ||||||
|   <meta name="viewport" content="width=device-width, initial-scale=1" /> | <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||||
|   <title>Safebox - INSTALLER TOOL</title> | <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> | ||||||
|   <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/> | <meta http-equiv="Pragma" content="no-cache" /> | ||||||
|   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/> | <meta http-equiv="Expires" content="0" /> | ||||||
|   <link rel="stylesheet" href="style.css?t=1" /> | <title>Safebox - INSTALLER TOOL</title> | ||||||
|  | <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/> | ||||||
|  | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/> | ||||||
|  | <link rel="stylesheet" href="style.css?t=1" /> | ||||||
| </head> | </head> | ||||||
| <body id="installer"> | <body id="installer"> | ||||||
|   <div class="main" > |   <div class="main" > | ||||||
|     <div id="myAppsContainer"> |     <div id="myAppsContainer"> | ||||||
| 	      <div class="logo"> | 	      <div class="logo"> | ||||||
| 		<img src="/img/logo.png" alt="Safebox"/> | 		<img src="/img/logo.svg" alt="Safebox"/> | ||||||
| 		<span>Safebox</span> | 		<span>Safebox</span> | ||||||
| 	      </div> | 	      </div> | ||||||
| 		<h3 style="text-align:center">No any previous deployed environment has found</h3> | 		<h3 style="text-align:center">No any previous deployed environment has found</h3> | ||||||
|   | |||||||
							
								
								
									
										173
									
								
								install.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,173 @@ | |||||||
|  |  | ||||||
|  | function updateProgress(percentage) { | ||||||
|  |     // Clamp percentage between 0 and 99.9 (never reach 100) | ||||||
|  |     percentage = Math.max(0, Math.min(99.9, percentage)); | ||||||
|  |      | ||||||
|  |     progressBar.style.width = percentage + '%'; | ||||||
|  |     progressText.textContent = Math.round(percentage) + '%'; | ||||||
|  |     currentProgress = percentage; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function setProgress(percentage) { | ||||||
|  |     clearInterval(progressInterval); | ||||||
|  |     updateProgress(percentage); | ||||||
|  |     startProgress(60000); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function startProgress(duration) { | ||||||
|  |     clearInterval(progressInterval); | ||||||
|  |     const startTime = Date.now() - (currentProgress / 100) * duration; | ||||||
|  |      | ||||||
|  |     progressInterval = setInterval(() => { | ||||||
|  | 	const elapsed = Date.now() - startTime; | ||||||
|  | 	// Use exponential approach to 100% - gets slower as it approaches | ||||||
|  | 	let progress = (1 - Math.exp(-4 * elapsed / duration)) * 100; | ||||||
|  | 	 | ||||||
|  | 	// Ensure it never reaches 100% | ||||||
|  | 	progress = Math.min(progress, 99.9); | ||||||
|  | 	 | ||||||
|  | 	updateProgress(progress); | ||||||
|  | 	 | ||||||
|  | 	// Stop when we've been running for 60+ seconds | ||||||
|  | 	if (elapsed >= duration) { | ||||||
|  | 	    clearInterval(progressInterval); | ||||||
|  | 	} | ||||||
|  |     }, 100); // Update every 100ms | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function resetProgress() { | ||||||
|  |     clearInterval(progressInterval); | ||||||
|  |     updateProgress(0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Example: Simulate loading with custom speeds | ||||||
|  | function simulateLoading(duration = 3000) { | ||||||
|  |     clearInterval(progressInterval); | ||||||
|  |     const startTime = Date.now(); | ||||||
|  |      | ||||||
|  |     progressInterval = setInterval(() => { | ||||||
|  | 	const elapsed = Date.now() - startTime; | ||||||
|  | 	const progress = Math.min((elapsed / duration) * 100, 99.9); | ||||||
|  | 	 | ||||||
|  | 	updateProgress(progress); | ||||||
|  | 	 | ||||||
|  | 	if (elapsed >= duration) { | ||||||
|  | 	    clearInterval(progressInterval); | ||||||
|  | 	} | ||||||
|  |     }, 16); // ~60fps | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function redirectToInstall() { | ||||||
|  | 	setProgress(100); | ||||||
|  | 	window.location.href = 'install.html?t='+Date.now(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function redirectToManage() { | ||||||
|  | 	setProgress(100); | ||||||
|  | 	window.location.href = 'manage.html?t='+Date.now(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function start_system() { | ||||||
|  |   var url  = 'scan.php?op=system'; | ||||||
|  |   $.get(url, function(data){ | ||||||
|  |     console.log('start_system: '+data); | ||||||
|  |     if (data=='OK') { | ||||||
|  |       $("#info").html('Scanning for previous install. Please wait...'); | ||||||
|  |       check_system(); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       $("#info").html('Scanning for previous install has aborted...'); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function check_system() { | ||||||
|  |   var url  = 'scan.php?op=check_system'; | ||||||
|  |   $.get(url, function(data){ | ||||||
|  |     console.log('check_system: '+data); | ||||||
|  |     if (data=='NEW') { | ||||||
|  |       $("#info").html('No previous install has found...'); | ||||||
|  |       setTimeout(redirectToInstall, 3000); | ||||||
|  |     } | ||||||
|  |     else if (data=='EXISTS') { | ||||||
|  |       $("#info").html('Previous install has found...'); | ||||||
|  |       setProgress(80); | ||||||
|  |       setTimeout(redirectToManage, 3000); | ||||||
|  |     } | ||||||
|  |     else if (data=='WAIT') { | ||||||
|  |       setTimeout(check_system, 1000); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  | 	    // UNEXPECTED ERROR | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function check_redis() { | ||||||
|  |  | ||||||
|  |   var url  = 'scan.php?op=redis'; | ||||||
|  |   $.get(url, function(data){ | ||||||
|  |     console.log('check_redis: '+data); | ||||||
|  |     if (data=='OK') { | ||||||
|  |       $("#info").html('Redis server - OK'); | ||||||
|  |       check_install(); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       $("#info").html('Redis server is not available...'); | ||||||
|  |       setTimeout(check_redis, 1000); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function check_directory() { | ||||||
|  |  | ||||||
|  |   var url  = 'scan.php?op=directory'; | ||||||
|  |   $.get(url, function(data){ | ||||||
|  |     console.log('check_directory: '+data); | ||||||
|  |     if (data=='OK') { | ||||||
|  |       $("#info").html('Connection is ready - OK'); | ||||||
|  |       check_install(); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       $("#info").html('Shared directory is not available...'); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function check_interface() { | ||||||
|  |  | ||||||
|  |   var url  = 'scan.php?op=get_interface'; | ||||||
|  |   $.get(url, function(data){ | ||||||
|  |     console.log('check_interface: '+data); | ||||||
|  |     if (data=='redis') { | ||||||
|  |   	check_redis(); | ||||||
|  |     } | ||||||
|  |     else if (data=='directory') { | ||||||
|  |   	check_directory(); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  | 	$("#info").html('Invalid interface definition...'); | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function check_install() { | ||||||
|  |  | ||||||
|  |     console.log('install: '+install); | ||||||
|  |     if (install==1) { | ||||||
|  | 	  var url  = 'scan.php?op=check_install'; | ||||||
|  | 	  $.get(url, function(data){ | ||||||
|  | 	    console.log('check_install:'+data+' counter: '+counter); | ||||||
|  | 	    if (data=='INSTALLED') { | ||||||
|  | 		redirectToManage(); | ||||||
|  | 	    } | ||||||
|  | 	    else { | ||||||
|  | 	      counter+=1 | ||||||
|  | 	      $("#info").html('Please wait ...'); | ||||||
|  | 	      setTimeout(check_install, 1000); | ||||||
|  | 	    } | ||||||
|  | 	  }); | ||||||
|  |     } | ||||||
|  |     else start_system(); // scan | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										126
									
								
								install.php
									
									
									
									
									
								
							
							
						
						| @@ -46,7 +46,7 @@ else { | |||||||
| 	$header_text="Installing in progress... Please wait..."; | 	$header_text="Installing in progress... Please wait..."; | ||||||
| 	//$key = "install:".date("YmdHis"); | 	//$key = "install:".date("YmdHis"); | ||||||
| 	$key = "install"; | 	$key = "install"; | ||||||
| 	if (set_output($key,$json)) echo "OK"; | 	if (set_output($key,$json)) echo ""; | ||||||
| 	else echo "ERROR"; | 	else echo "ERROR"; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -61,106 +61,54 @@ echo "<pre>".$output."</pre>"; | |||||||
| //echo $output; | //echo $output; | ||||||
| */ | */ | ||||||
|  |  | ||||||
| ?> | ?><!DOCTYPE html> | ||||||
| <!doctype html> |  | ||||||
| <html lang="en"> | <html lang="en"> | ||||||
| <head> | <head> | ||||||
| <!-- Required meta tags --> |   <meta charset="UTF-8" /> | ||||||
| <meta charset="utf-8"> |   <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||||
| <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |   <title>Safebox - INSTALLER TOOL</title> | ||||||
| <title>INSTALLER TOOL</title> |   <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/> | ||||||
| <!-- Bootstrap CSS --> |   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/> | ||||||
| <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/css/bootstrap.min.css" integrity="sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS" crossorigin="anonymous"> |   <link rel="stylesheet" href="style.css?t=4" /> | ||||||
| <!-- Custom styles for this template --> |  | ||||||
| <link href="installer.css?t=1" rel="stylesheet"> |  | ||||||
| </head> | </head> | ||||||
| <body id="install" class="text-center"> | <body id="install" class="text-center"> | ||||||
| <div class="container-fluid"> |   <div class="main"> | ||||||
| <div class="col-md-12"> |     <div id="myAppsContainer"> | ||||||
| 	<h1><?php echo $header_text?></h1> | 	<div class="logo" style="margin:100px 0px 20px 0px;"> | ||||||
| 	<div id="redis"></div> | 		<img src="/img/logo.svg" alt="Safebox"/> | ||||||
| 	<div id="response"></div> | 		<span>Safebox</span> | ||||||
| </div> | 	</div> | ||||||
| </div> | 	<div class="progress-box"> | ||||||
|  | 		<div class="progress-title"><?php echo $header_text?></div> | ||||||
|  | 		<div class="progress-description" id="info"></div> | ||||||
|  | 		<div class="progress-container-shadow"> | ||||||
|  | 		</div> | ||||||
|  | 		<div class="progress-container"> | ||||||
|  | 			<div class="progress-bar" id="progressBar"></div> | ||||||
|  | 			<div class="progress-text" id="progressText">0%</div> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
| <!-- Optional JavaScript --> | <!-- Optional JavaScript --> | ||||||
| <!-- jQuery first, then Popper.js, then Bootstrap JS --> | <!-- jQuery first, then Popper.js, then Bootstrap JS --> | ||||||
| <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> | <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> | ||||||
| <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script> | <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script> | ||||||
| <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> | <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> | ||||||
|  | <script src="install.js?t=7"></script> | ||||||
| <script> | <script> | ||||||
| $(function() { | const progressBar = document.getElementById('progressBar'); | ||||||
|  | const progressText = document.getElementById('progressText'); | ||||||
|  | let currentProgress = 0; | ||||||
|  | let progressInterval; | ||||||
|  | let install = 1; | ||||||
|  |  | ||||||
| function redirectToManage() { | // Initialize | ||||||
|     window.location.href = 'manage.html'; | updateProgress(0); | ||||||
| } | startProgress(90000);// 90 seconds | ||||||
|  |  | ||||||
| function check_install() { | check_interface(); | ||||||
|  | counter=0; | ||||||
|   var url  = 'scan.php?op=check_install&key=<?php echo $key;?>'; |  | ||||||
|   $.get(url, function(data){ |  | ||||||
|     console.log('check_install:'+data+' counter: '+counter); |  | ||||||
|     if (data=='INSTALLED') { |  | ||||||
| 	redirectToManage(); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|       counter+=1 |  | ||||||
|       $("#response").html('Please wait... ' + counter); |  | ||||||
|       setTimeout(check_install, 1000); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function check_redis() { |  | ||||||
|  |  | ||||||
|   var url  = 'scan.php?op=redis'; |  | ||||||
|   $.get(url, function(data){ |  | ||||||
|     console.log('check_redis: '+data); |  | ||||||
|     if (data=='OK') { |  | ||||||
|       $("#redis").html('Redis server - OK'); |  | ||||||
|       check_install(); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|       $("#redis").html('Redis server is not available...'); |  | ||||||
|       setTimeout(check_redis, 1000); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function check_directory() { |  | ||||||
|  |  | ||||||
|   var url  = 'scan.php?op=directory'; |  | ||||||
|   $.get(url, function(data){ |  | ||||||
|     console.log('check_directory: '+data); |  | ||||||
|     if (data=='OK') { |  | ||||||
|       $("#redis").html('Connection is ready - OK'); |  | ||||||
|       check_install(); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|       $("#redis").html('Shared directory is not available...'); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function check_interface() { |  | ||||||
|  |  | ||||||
|   var url  = 'scan.php?op=get_interface'; |  | ||||||
|   $.get(url, function(data){ |  | ||||||
|     console.log('check_interface: '+data); |  | ||||||
|     if (data=='redis') { |  | ||||||
|   	check_redis(); |  | ||||||
|     } |  | ||||||
|     else if (data=='directory') { |  | ||||||
|   	check_directory(); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
| 	$("#redis").html('Invalid interface definition...'); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
|  |  | ||||||
|   check_interface(); |  | ||||||
|   counter=0; |  | ||||||
| }); |  | ||||||
| </script> | </script> | ||||||
| </body> | </body> | ||||||
| </html> | </html> | ||||||
|   | |||||||
							
								
								
									
										107
									
								
								manage.html
									
									
									
									
									
								
							
							
						
						| @@ -1,32 +1,24 @@ | |||||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||||
| <html lang="hu"> | <html lang="hu"> | ||||||
| <head> | <head> | ||||||
|   <meta charset="UTF-8" /> | <meta charset="UTF-8" /> | ||||||
|   <meta name="viewport" content="width=device-width, initial-scale=1" /> | <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||||
|   <title>Safebox</title> | <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> | ||||||
|   <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/> | <meta http-equiv="Pragma" content="no-cache" /> | ||||||
|   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/> | <meta http-equiv="Expires" content="0" /> | ||||||
|   <link rel="stylesheet" href="style.css?t=1" /> | <title>Safebox</title> | ||||||
|  | <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/> | ||||||
|  | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/> | ||||||
|  | <link rel="stylesheet" href="style.css?t=11" /> | ||||||
| </head> | </head> | ||||||
| <body> | <body> | ||||||
|   <div class="sidebar"> |   <div class="sidebar"> | ||||||
|     <div> |     <div class="sidebar-top"> | ||||||
|       <div class="logo"> |       <div id="logo" class="logo"> | ||||||
|         <img src="/img/logo.png" alt="Safebox"/> |         <img src="/img/logo.svg" alt="Safebox"/> | ||||||
|         <span>Safebox</span> |         <span>Safebox</span> | ||||||
|       </div> |       </div> | ||||||
|       <div class="menu"> |       <div class="menu"> | ||||||
| 	    <div class="menu-item" style="margin-bottom:20px"> |  | ||||||
| 		<img src="/img/globe.png" data-src="/img/globe.png" data-hover="/img/globe.png" alt="VPN" /> |  | ||||||
| 		<div class="menu-label"> |  | ||||||
| 		    <span id="vpnBtn">VPN</span> |  | ||||||
| 		    <label class="switch"> |  | ||||||
| 		      <input type="checkbox" id="vpnToggle"> |  | ||||||
| 		      <span class="slider-text"><span class="switch-label">OFF</span></span> |  | ||||||
| 		    </label> |  | ||||||
| 		</div> |  | ||||||
| 	    </div> |  | ||||||
|  |  | ||||||
| <!-- | <!-- | ||||||
| 	<div class="menu-item"><i class="fas fa-th"></i><span>Applications</span></div> | 	<div class="menu-item"><i class="fas fa-th"></i><span>Applications</span></div> | ||||||
|         <div class="menu-item"><i class="fas fa-hdd"></i><span>Disk Management</span></div> |         <div class="menu-item"><i class="fas fa-hdd"></i><span>Disk Management</span></div> | ||||||
| @@ -46,29 +38,42 @@ | |||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|     <div class="yellow-row"> |     <div class="yellow-row"> | ||||||
|  | 	<div id="pro_off"> | ||||||
| 	    <div class="yellow-box"> | 	    <div class="yellow-box"> | ||||||
| 		<div id="pro_off"> | 		<div class="pro-text"> | ||||||
| 		      <h4>Safebox Pro</h4> | 		  <span>Safebox Pro</span> | ||||||
|  | 		</div> | ||||||
| 		      <p>Enjoy benefits and unlock more feature such as remote access, geo-redundant backups etc. <br><br> | 		      <p>Enjoy benefits and unlock more feature such as remote access, geo-redundant backups etc. <br><br> | ||||||
| 		      <a href="" class="details">Read details</a><br><br> | 		      <a href="" class="details">Read details</a><br><br> | ||||||
| 			<img src="/img/upgrade.png" alt="Upgrade now" width="100%"/>	 | 			<img src="/img/upgrade.png" alt="Upgrade now" width="80%" id="upgradeBtn" style="cursor:pointer"/>	 | ||||||
| 		      </p> | 		      </p> | ||||||
|  | 	    </div> | ||||||
|  | 	</div> | ||||||
|  | 	<div id="pro_on" class="hidden"> | ||||||
|  | 	    <div class="grey-box"> | ||||||
|  | 		<div class="vpn-text" id="vpnBtn" > | ||||||
|  | 		  <img src="/img/globe.png" data-src="/img/globe.png" data-hover="/img/globe.png" alt="VPN"/> | ||||||
|  | 		  <span>Remote access</span> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div id="pro_on" class="hidden"> | 		      <p>It allows you to connect your installed apps to a custom domain (your own or one registered through us), so you can securely log in from any browser, anywhere in the world. | ||||||
| 		      <h4>Login</h4> |  | ||||||
| 		      <p>Enjoy benefits and unlock more feature such as remote access, geo-redundant backups etc. <br><br> |  | ||||||
| 		      <a href="" class="details">Read details</a><br><br> |  | ||||||
| 		      </p> | 		      </p> | ||||||
| 		</div> | 			<div class="vpn-item"> | ||||||
| 	    </div> | <!-- | ||||||
| 	    <div class="yellow-corner"> | 			    <label class="switch"> | ||||||
| 		<img src="img/yellow_corner.png" alt=""/> | 			      <input type="checkbox" id="vpnToggle" onclick="return false"> | ||||||
|  | 			      <span class="slider-text"><span class="switch-label">OFF</span></span> | ||||||
|  | 			    </label> | ||||||
|  | --> | ||||||
|  | 				<span id="vpn_on" class="hidden"><img src="/img/on.png" alt="on" /></span> | ||||||
|  | 				<span id="vpn_off" class="hidden"><img src="/img/off.png" alt="off" /></span> | ||||||
|  | 			</div> | ||||||
| 	    </div> | 	    </div> | ||||||
|  | 	</div> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
|   <div class="main" > |   <div class="main" > | ||||||
|     <div id="myAppsContainer"> |     <div id="myAppsContainer"> | ||||||
| 	    Loading applications. Please wait... | 	    <div class="loading">Loading applications...</div> | ||||||
|     </div> |     </div> | ||||||
|     <div id="popup" class="popup hidden"> |     <div id="popup" class="popup hidden"> | ||||||
| 	<div class="popup-content"> | 	<div class="popup-content"> | ||||||
| @@ -93,6 +98,7 @@ | |||||||
|     const settingsBtn = document.getElementById('settingsBtn'); |     const settingsBtn = document.getElementById('settingsBtn'); | ||||||
|  |  | ||||||
|     const vpnBtn = document.getElementById('vpnBtn'); |     const vpnBtn = document.getElementById('vpnBtn'); | ||||||
|  |     const upgradeBtn = document.getElementById('upgradeBtn'); | ||||||
|  |  | ||||||
|     const myAppsContainer = document.getElementById('myAppsContainer'); |     const myAppsContainer = document.getElementById('myAppsContainer'); | ||||||
|     const popup = document.getElementById('popup'); |     const popup = document.getElementById('popup'); | ||||||
| @@ -176,16 +182,30 @@ | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     function renderMonitor() { | ||||||
|  |     	myAppsContainer.classList.remove('hidden'); | ||||||
|  |         popup.classList.add('hidden'); | ||||||
|  |  | ||||||
|  |         //TODO: itt kell a buttont editálni és így kell hozzáadni hozzá mindent | ||||||
|  |         myAppsContainer.innerHTML = ` | ||||||
|  | 	    <div class="main-header"> | ||||||
|  | 	      <h1>Monitor</h1> | ||||||
|  | 	      <button id="updatesBtn"><i class="fas fa-bell"></i> Notification</button> | ||||||
|  | 	    </div> | ||||||
|  |         	<img src="/img/monitor.jpg" alt="Under development..." width="1000" /> | ||||||
|  |         `; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     function renderVPN() { |     function renderVPN() { | ||||||
|     	myAppsContainer.classList.remove('hidden'); |     	myAppsContainer.classList.remove('hidden'); | ||||||
|         popup.classList.add('hidden'); |         popup.classList.add('hidden'); | ||||||
|  |  | ||||||
|         myAppsContainer.innerHTML = ` |         myAppsContainer.innerHTML = ` | ||||||
| 	    <div class="main-header"> | 	    <div class="main-header"> | ||||||
| 	      <h1>VPN</h1> | 	      <h1>VPN - enable proxy</h1> | ||||||
| 	    </div> | 	    </div> | ||||||
|             <div id="vpn" class="innerDiv"> |             <div id="vpn" class="innerDiv"> | ||||||
| 	    Loading... | 	    <div class="loading">Loading...</div> | ||||||
|             </div> |             </div> | ||||||
|         `; |         `; | ||||||
| 	get_proxy_html(); | 	get_proxy_html(); | ||||||
| @@ -197,7 +217,7 @@ | |||||||
| 	      <h1>Services</h1> | 	      <h1>Services</h1> | ||||||
| 	    </div> | 	    </div> | ||||||
|             <div id="services" class="innerDiv"> |             <div id="services" class="innerDiv"> | ||||||
| 	    Loading... | 	    <div class="loading">Loading...</div> | ||||||
|             </div> |             </div> | ||||||
|         `; |         `; | ||||||
| 	get_services(); | 	get_services(); | ||||||
| @@ -209,7 +229,7 @@ | |||||||
| 	      <h1>Updates</h1> | 	      <h1>Updates</h1> | ||||||
| 	    </div> | 	    </div> | ||||||
|             <div id="updates" class="innerDiv"> |             <div id="updates" class="innerDiv"> | ||||||
| 	    Looking for updates... Please wait... | 	    <div class="loading">Looking for updates...</div> | ||||||
|             </div> |             </div> | ||||||
|         `; |         `; | ||||||
| 	get_updates(); | 	get_updates(); | ||||||
| @@ -221,7 +241,7 @@ | |||||||
| 	      <h1>System services</h1> | 	      <h1>System services</h1> | ||||||
| 	    </div> | 	    </div> | ||||||
|             <div id="system" class="innerDiv"> |             <div id="system" class="innerDiv"> | ||||||
| 	    Loading... | 	    <div class="loading">Loading...</div> | ||||||
|             </div> |             </div> | ||||||
|         `; |         `; | ||||||
| 	get_system(); | 	get_system(); | ||||||
| @@ -293,7 +313,7 @@ | |||||||
| 	    <div class="main-header"> | 	    <div class="main-header"> | ||||||
| 	      <h1>Repositories</h1> | 	      <h1>Repositories</h1> | ||||||
| 	    </div> | 	    </div> | ||||||
| 		<div id="repositories" style="text-align:left">Loading...</div> | 		<div id="repositories" style="text-align:left">Loading repositories...</div> | ||||||
| 		<br> | 		<br> | ||||||
| 		<form class="form-install" action="#" method="post" id="add_repo"> | 		<form class="form-install" action="#" method="post" id="add_repo"> | ||||||
| 		<div class="input-row"> | 		<div class="input-row"> | ||||||
| @@ -336,13 +356,15 @@ | |||||||
| 	installAppsBtn.addEventListener('click', () => {renderApps(true); activate(installAppsBtn);}); | 	installAppsBtn.addEventListener('click', () => {renderApps(true); activate(installAppsBtn);}); | ||||||
| 	backupBtn.addEventListener('click', () => {renderText('Backup'); activate(backupBtn);}); | 	backupBtn.addEventListener('click', () => {renderText('Backup'); activate(backupBtn);}); | ||||||
| 	diskBtn.addEventListener('click', () => {renderText('Disk Management'); activate(diskBtn)}); | 	diskBtn.addEventListener('click', () => {renderText('Disk Management'); activate(diskBtn)}); | ||||||
| 	monitorBtn.addEventListener('click', () => {renderText('Monitor'); activate(monitorBtn)}); | 	monitorBtn.addEventListener('click', () => {renderMonitor(); activate(monitorBtn)}); | ||||||
|     	settingsBtn.addEventListener('click', () => {renderSettings(); activate(settingsBtn)}); |     	settingsBtn.addEventListener('click', () => {renderSettings(); activate(settingsBtn)}); | ||||||
|  |  | ||||||
| 	vpnBtn.addEventListener('click', () => renderVPN()); | 	vpnBtn.addEventListener('click', () => renderVPN()); | ||||||
|  | 	upgradeBtn.addEventListener('click', () => renderVPN()); | ||||||
|  |  | ||||||
| //	renderApps(true); | //	renderApps(true); | ||||||
|  |  | ||||||
|  | /* | ||||||
| 	const vpnToggle = document.getElementById("vpnToggle"); | 	const vpnToggle = document.getElementById("vpnToggle"); | ||||||
|   	const vpnLabel = document.querySelector(".switch-label"); |   	const vpnLabel = document.querySelector(".switch-label"); | ||||||
|  |  | ||||||
| @@ -351,9 +373,13 @@ | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	vpnToggle.addEventListener("change", updateStatus); | 	vpnToggle.addEventListener("change", updateStatus); | ||||||
|  | 	vpnToggle.addEventListener('click', function (e) { | ||||||
|  | 		e.preventDefault(); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
| 	// Alapállapot beállítása | 	// Alapállapot beállítása | ||||||
| 	updateStatus(); | 	updateStatus(); | ||||||
|  | */ | ||||||
|  |  | ||||||
| }); | }); | ||||||
| </script> | </script> | ||||||
| @@ -363,7 +389,6 @@ | |||||||
| <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> | <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> | ||||||
| <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script> | <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script> | ||||||
| <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> | <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> | ||||||
| <script src="common.js?t=30"></script> | <script src="common.js?t=41"></script> | ||||||
| </body> | </body> | ||||||
| </html> | </html> | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										188
									
								
								scan.html
									
									
									
									
									
								
							
							
						
						| @@ -1,18 +1,21 @@ | |||||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||||
| <html lang="en"> | <html lang="en"> | ||||||
| <head> | <head> | ||||||
|   <meta charset="UTF-8" /> | <meta charset="UTF-8" /> | ||||||
|   <meta name="viewport" content="width=device-width, initial-scale=1" /> | <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||||
|   <title>Safebox - INSTALLER TOOL</title> | <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> | ||||||
|   <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/> | <meta http-equiv="Pragma" content="no-cache" /> | ||||||
|   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/> | <meta http-equiv="Expires" content="0" /> | ||||||
|   <link rel="stylesheet" href="style.css?t=3" /> | <title>Safebox - INSTALLER TOOL</title> | ||||||
|  | <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Switzer:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap"/> | ||||||
|  | <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"/> | ||||||
|  | <link rel="stylesheet" href="style.css?t=4" /> | ||||||
| </head> | </head> | ||||||
| <body id="scan" class="text-center"> | <body id="scan" class="text-center"> | ||||||
|   <div class="main"> |   <div class="main"> | ||||||
|     <div id="myAppsContainer"> |     <div id="myAppsContainer"> | ||||||
| 	<div class="logo" style="margin-top:100px"> | 	<div class="logo" style="margin:100px 0px 20px 0px;"> | ||||||
| 		<img src="/img/logo.png" alt="Safebox"/> | 		<img src="/img/logo.svg" alt="Safebox"/> | ||||||
| 		<span>Safebox</span> | 		<span>Safebox</span> | ||||||
| 	</div> | 	</div> | ||||||
| 	<div class="progress-box"> | 	<div class="progress-box"> | ||||||
| @@ -25,11 +28,11 @@ | |||||||
| 			<div class="progress-text" id="progressText">0%</div> | 			<div class="progress-text" id="progressText">0%</div> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
|  | <!-- | ||||||
|     <div class="controls"> | 	<div class="controls"> | ||||||
|         <button onclick="document.location='install.html'" class="save-button">STOP AND START INSTALL</button> |         	<button onclick="document.location='install.html'" class="save-button">STOP AND START INSTALL</button> | ||||||
|     </div> | 	</div> | ||||||
|  | --> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
| <!-- Optional JavaScript --> | <!-- Optional JavaScript --> | ||||||
| @@ -37,172 +40,19 @@ | |||||||
| <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> | <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> | ||||||
| <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script> | <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.6/dist/umd/popper.min.js" integrity="sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut" crossorigin="anonymous"></script> | ||||||
| <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> | <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.2.1/dist/js/bootstrap.min.js" integrity="sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U/mkkaduKaBhlAXv9k" crossorigin="anonymous"></script> | ||||||
|  | <script src="install.js?t=7"></script> | ||||||
| <script> | <script> | ||||||
| const progressBar = document.getElementById('progressBar'); | const progressBar = document.getElementById('progressBar'); | ||||||
| const progressText = document.getElementById('progressText'); | const progressText = document.getElementById('progressText'); | ||||||
| let currentProgress = 0; | let currentProgress = 0; | ||||||
| let progressInterval; | let progressInterval; | ||||||
|  | let install = 0; // scan | ||||||
| function updateProgress(percentage) { |  | ||||||
|     // Clamp percentage between 0 and 99.9 (never reach 100) |  | ||||||
|     percentage = Math.max(0, Math.min(99.9, percentage)); |  | ||||||
|      |  | ||||||
|     progressBar.style.width = percentage + '%'; |  | ||||||
|     progressText.textContent = Math.round(percentage) + '%'; |  | ||||||
|     currentProgress = percentage; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function setProgress(percentage) { |  | ||||||
|     clearInterval(progressInterval); |  | ||||||
|     updateProgress(percentage); |  | ||||||
|     startProgress(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function startProgress() { |  | ||||||
|     clearInterval(progressInterval); |  | ||||||
|     const duration = 60000; // 60 seconds |  | ||||||
|     const startTime = Date.now() - (currentProgress / 100) * duration; |  | ||||||
|      |  | ||||||
|     progressInterval = setInterval(() => { |  | ||||||
| 	const elapsed = Date.now() - startTime; |  | ||||||
| 	// Use exponential approach to 100% - gets slower as it approaches |  | ||||||
| 	let progress = (1 - Math.exp(-4 * elapsed / duration)) * 100; |  | ||||||
| 	 |  | ||||||
| 	// Ensure it never reaches 100% |  | ||||||
| 	progress = Math.min(progress, 99.9); |  | ||||||
| 	 |  | ||||||
| 	updateProgress(progress); |  | ||||||
| 	 |  | ||||||
| 	// Stop when we've been running for 60+ seconds |  | ||||||
| 	if (elapsed >= duration) { |  | ||||||
| 	    clearInterval(progressInterval); |  | ||||||
| 	} |  | ||||||
|     }, 100); // Update every 100ms |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function resetProgress() { |  | ||||||
|     clearInterval(progressInterval); |  | ||||||
|     updateProgress(0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Example: Simulate loading with custom speeds |  | ||||||
| function simulateLoading(duration = 3000) { |  | ||||||
|     clearInterval(progressInterval); |  | ||||||
|     const startTime = Date.now(); |  | ||||||
|      |  | ||||||
|     progressInterval = setInterval(() => { |  | ||||||
| 	const elapsed = Date.now() - startTime; |  | ||||||
| 	const progress = Math.min((elapsed / duration) * 100, 99.9); |  | ||||||
| 	 |  | ||||||
| 	updateProgress(progress); |  | ||||||
| 	 |  | ||||||
| 	if (elapsed >= duration) { |  | ||||||
| 	    clearInterval(progressInterval); |  | ||||||
| 	} |  | ||||||
|     }, 16); // ~60fps |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function redirectToInstall() { |  | ||||||
| 	setProgress(100); |  | ||||||
| 	window.location.href = 'install.html'; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function redirectToManage() { |  | ||||||
| 	setProgress(100); |  | ||||||
| 	window.location.href = 'manage.html'; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function start_system() { |  | ||||||
|   var url  = 'scan.php?op=system'; |  | ||||||
|   $.get(url, function(data){ |  | ||||||
|     console.log('start_system: '+data); |  | ||||||
|     if (data=='OK') { |  | ||||||
|       $("#info").html('Scanning for previous install. Please wait...'); |  | ||||||
|       check_system(); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|       $("#info").html('Scanning for previous install has aborted...'); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function check_system() { |  | ||||||
|   var url  = 'scan.php?op=check_system'; |  | ||||||
|   $.get(url, function(data){ |  | ||||||
|     console.log('check_system: '+data); |  | ||||||
|     if (data=='NEW') { |  | ||||||
|       $("#info").html('No previous install has found...'); |  | ||||||
|       setTimeout(redirectToInstall, 3000); |  | ||||||
|     } |  | ||||||
|     else if (data=='EXISTS') { |  | ||||||
|       $("#info").html('Previous install has found...'); |  | ||||||
|       setProgress(80); |  | ||||||
|       setTimeout(redirectToManage, 3000); |  | ||||||
|     } |  | ||||||
|     else if (data=='WAIT') { |  | ||||||
|       setTimeout(check_system, 1000); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
| 	    // UNEXPECTED ERROR |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function check_redis() { |  | ||||||
|  |  | ||||||
|   var url  = 'scan.php?op=redis'; |  | ||||||
|   $.get(url, function(data){ |  | ||||||
|     console.log('check_redis: '+data); |  | ||||||
|     if (data=='OK') { |  | ||||||
|       $("#info").html('Redis server - OK'); |  | ||||||
|       start_system(); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|       $("#info").html('Redis server is not available...'); |  | ||||||
|       setTimeout(check_redis, 1000); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function check_directory() { |  | ||||||
|  |  | ||||||
|   var url  = 'scan.php?op=directory'; |  | ||||||
|   $.get(url, function(data){ |  | ||||||
|     console.log('check_directory: '+data); |  | ||||||
|     if (data=='OK') { |  | ||||||
|       $("#info").html('Connection is ready - OK'); |  | ||||||
|       start_system(); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|       $("#info").html('Shared directory is not available...'); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| function check_interface() { |  | ||||||
|  |  | ||||||
|   var url  = 'scan.php?op=get_interface'; |  | ||||||
|   $.get(url, function(data){ |  | ||||||
|     console.log('check_interface: '+data); |  | ||||||
|     if (data=='redis') { |  | ||||||
|   	check_redis(); |  | ||||||
|     } |  | ||||||
|     else if (data=='directory') { |  | ||||||
|   	check_directory(); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
| 	$("#info").html('Invalid interface definition...'); |  | ||||||
|     } |  | ||||||
|   }); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Initialize | // Initialize | ||||||
| updateProgress(0); | updateProgress(0); | ||||||
| startProgress(); | startProgress(30000);// 30 seconds | ||||||
|  |  | ||||||
| check_interface(); | check_interface(); | ||||||
|  |  | ||||||
| </script> | </script> | ||||||
| </body> | </body> | ||||||
| </html> | </html> | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								scan.php
									
									
									
									
									
								
							
							
						
						| @@ -59,12 +59,12 @@ switch ($_GET["op"]) { | |||||||
| 		} | 		} | ||||||
| 		else echo "WAIT"; | 		else echo "WAIT"; | ||||||
| 	break; | 	break; | ||||||
| 	case "check_install": // called in install.php - check if install process has finished | 	case "check_install": // called in install.js - check if install process has finished | ||||||
| 		$arr = check_response($_GET["key"]); // TODO - replace key with "install", key can be "install*" | 		$arr = check_response("install"); | ||||||
| 		if (!empty($arr)) { | 		if (!empty($arr)) { | ||||||
| 			foreach ($arr as $key=>$data) { | 			foreach ($arr as $key=>$data) { | ||||||
| 				//echo $key."-".$_GET["key"]; | 				//echo $key."-".$_GET["key"]; | ||||||
| 				if ($key==$_GET["key"]) { // if install key moved to web_out | 				if ($key=="install") { // if install key moved to web_out | ||||||
| 					if ($data["INSTALL_STATUS"]>0) { | 					if ($data["INSTALL_STATUS"]>0) { | ||||||
| 						remove_response("$key"); | 						remove_response("$key"); | ||||||
| 						echo "INSTALLED"; | 						echo "INSTALLED"; | ||||||
| @@ -149,7 +149,7 @@ switch ($_GET["op"]) { | |||||||
| 								$subtitle = $content["subtitle"]; | 								$subtitle = $content["subtitle"]; | ||||||
| 								if (empty($subtitle) || $subtitle == "null") $subtitle = ""; | 								if (empty($subtitle) || $subtitle == "null") $subtitle = ""; | ||||||
| 								$icon = $content["icon"]; | 								$icon = $content["icon"]; | ||||||
| 								if (empty($icon) || $icon == "null") $icon = "img/default_logo.png"; // default icon image | 								if (empty($icon) || $icon == "null") $icon = "img/logo.svg"; // default icon image | ||||||
| 								if (array_key_exists($service_name,$data["INSTALLED_SERVICES"])) $installed = "true"; | 								if (array_key_exists($service_name,$data["INSTALLED_SERVICES"])) $installed = "true"; | ||||||
| 								else $installed = "false"; | 								else $installed = "false"; | ||||||
| 								if (!empty($deployments)) $deployments .= ", "; | 								if (!empty($deployments)) $deployments .= ", "; | ||||||
| @@ -182,6 +182,7 @@ switch ($_GET["op"]) { | |||||||
| 				if ($key=="deployment") { | 				if ($key=="deployment") { | ||||||
| 					if ($data["STATUS"]=="0") { // ask | 					if ($data["STATUS"]=="0") { // ask | ||||||
| 						$template = json_decode(base64_decode($data["TEMPLATE"])); | 						$template = json_decode(base64_decode($data["TEMPLATE"])); | ||||||
|  | 						$template->name = strtolower($template->name); | ||||||
|  |  | ||||||
| 						echo ' | 						echo ' | ||||||
| 						<div class="app-details"> | 						<div class="app-details"> | ||||||
| @@ -191,7 +192,7 @@ switch ($_GET["op"]) { | |||||||
| 								<img src="'.$template->icon.'"> | 								<img src="'.$template->icon.'"> | ||||||
| 							    </div> | 							    </div> | ||||||
| 							    <div class="text-content"> | 							    <div class="text-content"> | ||||||
| 							      <h1 class="title">'.$template->name.'</h1> | 							      <h1 class="title">'.$template->title.'</h1> | ||||||
| 							      <h2 class="subtitle">'.$template->subtitle.'</h2> | 							      <h2 class="subtitle">'.$template->subtitle.'</h2> | ||||||
| 							      <p class="description">'.$template->description.'</p> | 							      <p class="description">'.$template->description.'</p> | ||||||
| 							    </div> | 							    </div> | ||||||
| @@ -347,7 +348,7 @@ switch ($_GET["op"]) { | |||||||
| 			$text="A deployment ({$_GET["additional"]}) has already started.<br>Please wait and do not start a new one..."; | 			$text="A deployment ({$_GET["additional"]}) has already started.<br>Please wait and do not start a new one..."; | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
| 			$text="Install in progress... Please wait..."; | 			$text="Install in progress..."; | ||||||
| 			$fields = $_GET; | 			$fields = $_GET; | ||||||
| 			unset($fields["op"]); | 			unset($fields["op"]); | ||||||
| 			unset($fields["additional"]); | 			unset($fields["additional"]); | ||||||
| @@ -492,6 +493,15 @@ switch ($_GET["op"]) { | |||||||
|                 } |                 } | ||||||
|                 echo $text; |                 echo $text; | ||||||
|         break; |         break; | ||||||
|  | 	case "version": | ||||||
|  | 		$arr = check_response("version"); | ||||||
|  | 		if (!empty($arr)) { | ||||||
|  | 			$data = $arr["version"]; | ||||||
|  | 			echo "Framework version: ".$data["VERSION"]."\n"; | ||||||
|  | 		} | ||||||
|  | 		else echo "Version not found"; | ||||||
|  | 		echo "Frontend version: 1.1.14"; | ||||||
|  | 	break; | ||||||
| 	case "repositories": | 	case "repositories": | ||||||
| 		$arr = array("STATUS" => 0); | 		$arr = array("STATUS" => 0); | ||||||
| 		$json = json_encode($arr, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT); | 		$json = json_encode($arr, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT); | ||||||
|   | |||||||
							
								
								
									
										75
									
								
								style.css
									
									
									
									
									
								
							
							
						
						| @@ -1,5 +1,5 @@ | |||||||
|     :root { |     :root { | ||||||
|       --highlight-color: #F9DB54; |       --highlight-color: #FFB806; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     body { |     body { | ||||||
| @@ -47,7 +47,7 @@ | |||||||
|   pointer-events: none; |   pointer-events: none; | ||||||
| } | } | ||||||
| .progress-container { | .progress-container { | ||||||
|     width: 280px; |     width: 300px; | ||||||
|     height: 40px; |     height: 40px; | ||||||
|     border-radius: 5px; |     border-radius: 5px; | ||||||
|     overflow: hidden; |     overflow: hidden; | ||||||
| @@ -96,16 +96,24 @@ | |||||||
|       background-color: #101214; |       background-color: #101214; | ||||||
|       display: flex; |       display: flex; | ||||||
|       flex-direction: column; |       flex-direction: column; | ||||||
|  |       /*height: 100vh;*/ | ||||||
|       justify-content: space-between; |       justify-content: space-between; | ||||||
|       padding: 20px 0; |  | ||||||
|       margin: 20px; |       margin: 20px; | ||||||
|       border-radius: 20px; |       border-radius: 20px; | ||||||
|       transition: width 0.3s; |       transition: width 0.3s; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | .sidebar-top { | ||||||
|  |       padding: 20px 0px 0px 0px; | ||||||
|  | 	overflow-y: auto; | ||||||
|  | 	flex: 1 1 auto; | ||||||
|  | 	display: flex; | ||||||
|  | 	flex-direction: column; | ||||||
|  | 	justify-content: center; /* ez teszi középre függőlegesen a menüt */ | ||||||
|  | } | ||||||
|  |  | ||||||
|     .logo { |     .logo { | ||||||
|       text-align: center; |       text-align: center; | ||||||
|       margin-bottom: 40px; |  | ||||||
|       font-size: 24px; |       font-size: 24px; | ||||||
|       font-weight: bold; |       font-weight: bold; | ||||||
|       display: flex; |       display: flex; | ||||||
| @@ -118,9 +126,16 @@ | |||||||
|       height: 30px; |       height: 30px; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     .loading { | ||||||
|  | 	    text-align:center; | ||||||
|  | 	    margin-top:300px; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     .menu { |     .menu { | ||||||
|       display: flex; |       display: flex; | ||||||
|       flex-direction: column; |       flex-direction: column; | ||||||
|  |       justify-content: center; /* középre igazít függőlegesen */ | ||||||
|  |       flex-grow: 1; | ||||||
|       gap: 5px; |       gap: 5px; | ||||||
|       padding: 0 10px; |       padding: 0 10px; | ||||||
|     } |     } | ||||||
| @@ -129,8 +144,6 @@ | |||||||
|       display: flex; |       display: flex; | ||||||
|       align-items: center; |       align-items: center; | ||||||
|       gap: 10px; |       gap: 10px; | ||||||
|       padding: 10px 20px; |  | ||||||
|       cursor: pointer; |  | ||||||
|       color: white; |       color: white; | ||||||
|       transition: color 0.3s; |       transition: color 0.3s; | ||||||
|     } |     } | ||||||
| @@ -227,7 +240,7 @@ | |||||||
|   right: 0; |   right: 0; | ||||||
|   bottom: 0; |   bottom: 0; | ||||||
|   background-color: #ccc; |   background-color: #ccc; | ||||||
|   border-radius: 26px; |   border-radius: 8px; | ||||||
|   transition: background-color 0.3s; |   transition: background-color 0.3s; | ||||||
|   display: flex !important; |   display: flex !important; | ||||||
|   align-items: center; |   align-items: center; | ||||||
| @@ -235,7 +248,7 @@ | |||||||
|   padding: 0 8px; |   padding: 0 8px; | ||||||
|   font-size: 12px; |   font-size: 12px; | ||||||
|   font-weight: bold; |   font-weight: bold; | ||||||
|   color: #fff; |   color: #000; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Circle */ | /* Circle */ | ||||||
| @@ -253,7 +266,7 @@ | |||||||
|  |  | ||||||
| /* Checked: move dot, change background and text alignment */ | /* Checked: move dot, change background and text alignment */ | ||||||
| .switch input:checked + .slider-text { | .switch input:checked + .slider-text { | ||||||
|   background-color: #4CAF50; |   background-color: var(--highlight-color); | ||||||
|   justify-content: flex-start; |   justify-content: flex-start; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -277,24 +290,29 @@ | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     .yellow-row { |     .yellow-row { | ||||||
|  | 	flex-shrink: 0; | ||||||
| 	max-width:250px; | 	max-width:250px; | ||||||
| 	display: flex; | 	display: flex; | ||||||
| 	align-items: flex-start; | 	align-items: flex-start; | ||||||
| 	box-sizing: border-box; | 	box-sizing: border-box; | ||||||
|         margin: 0px; |         margin: 0px; | ||||||
| 	width: 100%; | 	width: 100%; | ||||||
| 	padding: 0 20px; | 	padding: 0px 20px 20px 20px; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     .yellow-box { |     .yellow-box { | ||||||
|       background-color: var(--highlight-color); |       background-image: url('img/yellow-box.png'); | ||||||
|  |       background-repeat: no-repeat; | ||||||
|  |       /*background-color: var(--highlight-color); | ||||||
|  |       border-radius: 20px 20px 0px 20px;*/ | ||||||
|       color: black; |       color: black; | ||||||
|       text-align: left; |       text-align: left; | ||||||
|       margin: 0px; |       margin: 0px; | ||||||
|       padding: 10px 18px; |       padding: 20px 18px; | ||||||
|       border-radius: 20px 20px 0px 20px; |  | ||||||
|       font-weight: bold; |       font-weight: bold; | ||||||
|       font-size: 12px; |       font-size: 12px; | ||||||
|  |       width: 156px; | ||||||
|  |       height: 176px; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     .yellow-corner { |     .yellow-corner { | ||||||
| @@ -306,6 +324,35 @@ | |||||||
| 	align-items: flex-end; | 	align-items: flex-end; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | .pro-text { | ||||||
|  | 	font-size: 16px; | ||||||
|  | 	color: black; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |     .grey-box { | ||||||
|  |       background-image: url('img/grey-box.png'); | ||||||
|  |       background-repeat: no-repeat; | ||||||
|  |  /*     border: 2px solid #41464f;  */ | ||||||
|  |       border-radius: 20px 20px 0px 20px; | ||||||
|  |       color: #999; | ||||||
|  |       text-align: left; | ||||||
|  |       margin: 0px; | ||||||
|  |       padding: 20px 18px; | ||||||
|  |       font-weight: bold; | ||||||
|  |       font-size: 12px; | ||||||
|  |       width: 158px; | ||||||
|  |       height: 178px; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | .vpn-text { | ||||||
|  | 	display: flex; | ||||||
|  | 	align-items: center;  /* Ez igazítja középre függőlegesen a tartalmat */ | ||||||
|  | 	gap: 10px;            /* Távolság kép és szöveg között (opcionális) */ | ||||||
|  | 	font-size: 16px; | ||||||
|  | 	color: var(--highlight-color); | ||||||
|  | 	cursor: pointer; | ||||||
|  | } | ||||||
|  |  | ||||||
|     .main { |     .main { | ||||||
|       flex: 1; |       flex: 1; | ||||||
|       padding: 30px; |       padding: 30px; | ||||||
| @@ -396,7 +443,7 @@ | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	.app-fields .row { | 	.app-fields .row { | ||||||
|             display: block; |             display: flex; | ||||||
| 	      justify-content: space-between; | 	      justify-content: space-between; | ||||||
| 	      align-items: center; | 	      align-items: center; | ||||||
| 	      padding: 5px 20px; | 	      padding: 5px 20px; | ||||||
|   | |||||||