mirror of
				https://github.com/ShaYmez/FreeSTAR-Status-Engine.git
				synced 2025-10-31 12:00:19 -04:00 
			
		
		
		
	
						commit
						3171670a43
					
				
							
								
								
									
										3
									
								
								404.php
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								404.php
									
									
									
									
									
								
							| @ -1,4 +1,7 @@ | ||||
| <?php  | ||||
| define("NAME", ""); | ||||
| define("TITLE", ""); | ||||
| define("WEB_URL", ""); | ||||
| require_once("template.php"); | ||||
| if (!file_exists("config.php")) | ||||
| { | ||||
|  | ||||
							
								
								
									
										32
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| FROM php:8.2-apache | ||||
| RUN docker-php-ext-install mysqli | ||||
| RUN docker-php-ext-enable mysqli | ||||
| RUN apt-get update | ||||
| RUN apt-get install libzip-dev -y | ||||
| RUN docker-php-ext-install zip | ||||
| RUN docker-php-ext-enable zip | ||||
| RUN a2enmod rewrite | ||||
| RUN touch /usr/local/etc/php/conf.d/ssp.ini | ||||
| RUN echo "output_buffering = 16384" >> /usr/local/etc/php/conf.d/ssp.ini | ||||
| RUN echo "display_errors = off" >> /usr/local/etc/php/conf.d/ssp.ini | ||||
| RUN echo "error_reporting = E_ERROR" >> /usr/local/etc/php/conf.d/ssp.ini | ||||
| RUN apt install git -y | ||||
| WORKDIR /var/www/html | ||||
| RUN docker-php-ext-install gettext | ||||
| RUN docker-php-ext-install pdo_mysql | ||||
| RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && docker-php-ext-configure gd --with-freetype --with-jpeg && docker-php-ext-install -j$(nproc) gd | ||||
| RUN apt-get install -y locales | ||||
| RUN locale-gen en_GB.UTF-8 | ||||
| RUN sed -i '/en_GB.UTF-8/s/^# //g' /etc/locale.gen && \ | ||||
|     locale-gen | ||||
| RUN apt-get install -y curl | ||||
| # And clean up the image | ||||
| RUN rm -rf /var/lib/apt/lists/* | ||||
| 
 | ||||
| RUN curl -Lsf 'https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz' | tar -C '/usr/local' -xvzf - | ||||
| ENV PATH /usr/local/go/bin:$PATH | ||||
| RUN go get github.com/mailhog/mhsendmail | ||||
| RUN cp /root/go/bin/mhsendmail /usr/bin/mhsendmail | ||||
| RUN echo 'sendmail_path = /usr/bin/mhsendmail --smtp-addr mailhog:1025' > /usr/local/etc/php/php.ini | ||||
| 
 | ||||
| 
 | ||||
| @ -47,7 +47,7 @@ Template::render_header(_("User"), true); | ||||
| ?>
 | ||||
| <div class="text-center"> | ||||
| 	  <h1><?php  | ||||
| 	  if ($_SESSION['user'] == $_GET['id']) | ||||
| 	  if (isset($_GET['id']) && isset($_SESSION['user']) && $_SESSION['user'] == $_GET['id']) | ||||
| 	  { | ||||
| 		echo _("User settings"); | ||||
| 	  }else{ | ||||
|  | ||||
| @ -69,7 +69,7 @@ class Constellation | ||||
|    * @param boolean $admin | ||||
|    * @return array of services | ||||
|    */ | ||||
|   public function render_status($admin = false, $heading = true){ | ||||
|   public function render_status($admin = false, $heading = true): array{ | ||||
|     global $mysqli; | ||||
| 
 | ||||
|     //$query = $mysqli->query("SELECT id, name, description FROM services");
 | ||||
| @ -104,27 +104,12 @@ class Constellation | ||||
|     } | ||||
|     if (!$admin) | ||||
|     { | ||||
|       ?>
 | ||||
|       <script> | ||||
|       $(document).ready(function(){ | ||||
|         $('[data-toggle="tooltip"]').tooltip(); | ||||
|       }); | ||||
|       </script> | ||||
|       <?php | ||||
|       //echo '<div id="status-container" class="clearfix">';
 | ||||
|       //$arrCompletedGroups = array();
 | ||||
|        | ||||
|       foreach($array as $service){ | ||||
|         //print_r($service);
 | ||||
|         //if ( !empty($service->group_name) && !in_array($service->group_name, $arrCompletedGroups)) {
 | ||||
| //print $service->name;
 | ||||
|         //  $arrCompletedGroups[] = $service['group_name'];
 | ||||
|         //  $service->render(true);
 | ||||
|         //} else {
 | ||||
|         $service->render(); | ||||
|         //}
 | ||||
|       } | ||||
|       echo '</ul>'; | ||||
|       //echo '</div>';
 | ||||
|       return $array; | ||||
|     } | ||||
|     else{ | ||||
|       return $array; | ||||
|  | ||||
| @ -223,7 +223,7 @@ class Incident implements JsonSerializable | ||||
|       <?php | ||||
|   } | ||||
| 
 | ||||
|   public function jsonSerialize() { | ||||
|   public function jsonSerialize():mixed { | ||||
|     return [ | ||||
|       "id" => $this->id, | ||||
|       "date" => $this->timestamp, | ||||
|  | ||||
| @ -150,7 +150,6 @@ class LocaleNegotiator | ||||
| 		'nl_BE' => 'Nederlands', | ||||
| 		'nl_NL' => 'Nederlands', | ||||
| 		'nn_NO' => 'Nynorsk', | ||||
| 		'nb_NO' => 'Norsk Bokmål', | ||||
| 		'nso_ZA' => 'Northern sotho', | ||||
| 		'oc_FR' => 'Occitan', | ||||
| 		'or_IN' => 'ଓଡ଼ିଆ', | ||||
|  | ||||
| @ -60,6 +60,11 @@ class Notification | ||||
|         $sql = "SELECT DISTINCT subscriberIDFK FROM services_subscriber WHERE serviceIDFK IN (" . $this->serviceids . ")"; | ||||
|         $query = $mysqli->query($sql); | ||||
| 
 | ||||
|         if (0 === $query->num_rows) { | ||||
|           // skip processing if no one needs to be notified
 | ||||
|           return; | ||||
|         } | ||||
| 
 | ||||
|         // Create the queue tasks for email/telegram notifications
 | ||||
|         $queue = new Queue(); | ||||
|         $queue->status  = $queue->all_status['populating']; | ||||
| @ -125,7 +130,7 @@ class Notification | ||||
|      * @param string $msg Body of message | ||||
|      * @return boolean true = Sent / False = failed | ||||
|      */ | ||||
|     public function submit_queue_telegram($userID, $firstname, $msg) | ||||
|     public static function submit_queue_telegram($userID, $firstname, $msg) | ||||
|     { | ||||
|         // TODO Handle limitations (Max 30 different subscribers per second)
 | ||||
|         // TODO Error handling
 | ||||
| @ -150,7 +155,7 @@ class Notification | ||||
|      * @param String $uthkey Users token for managing subscription | ||||
|      * @return void | ||||
|      */ | ||||
|     public function submit_queue_email($subscriber, $subject, $msg) | ||||
|     public static function submit_queue_email($subscriber, $subject, $msg): bool | ||||
|     { | ||||
|         // TODO Error handling
 | ||||
|         $mailer = new Mailer(); | ||||
|  | ||||
| @ -49,7 +49,7 @@ class Queue | ||||
|      * Remove task from the queue | ||||
|      * @return void | ||||
|      */ | ||||
|     public function delete_task($task_id){ | ||||
|     public static function delete_task($task_id){ | ||||
|         global $mysqli; | ||||
|         $stmt = $mysqli->prepare("DELETE FROM queue_task WHERE id = ?"); | ||||
|         $stmt->bind_param("i", $task_id); | ||||
| @ -98,14 +98,14 @@ class Queue | ||||
|         $this->set_task_status($this->all_status['ready']); // Make task available for release
 | ||||
|     } | ||||
| 
 | ||||
|     public function update_notification_retries($task_id, $subscriber_id) { | ||||
|     public static function update_notification_retries($task_id, $subscriber_id) { | ||||
|         global $mysqli; | ||||
|         $stmt = $mysqli->prepare("UPDATE queue_notify SET retries = retries+1 WHERE task_id = ? AND subscriber_id = ?"); | ||||
|         $stmt->bind_param("ii", $task_id, $subscriber_id); | ||||
|         $stmt->execute(); | ||||
|     } | ||||
| 
 | ||||
|     public function delete_notification($task_id, $subscriber_id) { | ||||
|     public static function delete_notification($task_id, $subscriber_id) { | ||||
|         global $mysqli; | ||||
|         $stmt = $mysqli->prepare("DELETE FROM queue_notify WHERE task_id = ? AND subscriber_id = ?"); | ||||
|         $stmt->bind_param("ii", $task_id, $subscriber_id); | ||||
| @ -114,7 +114,7 @@ class Queue | ||||
|     } | ||||
| 
 | ||||
|     // TODO: Fix max attempts for notifications
 | ||||
|     public function process_queue(){ | ||||
|     public static function process_queue(){ | ||||
|       global $mysqli; | ||||
|       $stmt = $mysqli->query("SELECT qn.id, qn.task_id, qn.status, qn.subscriber_id, qn.retries, sub.firstname, sub.userID, sub.token FROM queue_notify AS qn INNER JOIN subscribers AS sub ON qn.subscriber_id = sub.subscriberID WHERE qn.status NOT LIKE 2 AND sub.active=1"); | ||||
|       while ( $result = $stmt->fetch_assoc() ) { | ||||
|  | ||||
| @ -8,6 +8,7 @@ class ServiceGroup | ||||
|   private $name; | ||||
|   private $description; | ||||
|   private $visibility_id; | ||||
|   private $status; | ||||
| 
 | ||||
|   /** | ||||
|    * Constructs servicegroup from its data. | ||||
| @ -16,7 +17,7 @@ class ServiceGroup | ||||
|    * @param String $description tooltip text | ||||
|    * @param int $visibility_id how to display group items | ||||
|    */ | ||||
|   function __construct($id, $name, $description, $visibility_id) | ||||
|   function __construct($id, $name, $description, $visibility_id, $status) | ||||
| 
 | ||||
|   { | ||||
|     //TODO: Maybe get data from ID?
 | ||||
| @ -153,7 +154,7 @@ class ServiceGroup | ||||
|    * Get list of services groups. | ||||
|    * @return array $groups | ||||
|    */ | ||||
|   public function get_groups() { | ||||
|   public static function get_groups() { | ||||
|     global $mysqli; | ||||
|     $stmt = $mysqli->query("SELECT id, name FROM services_groups ORDER by name ASC"); | ||||
| 
 | ||||
|  | ||||
| @ -180,7 +180,7 @@ class Service implements JsonSerializable | ||||
|    * @param Service[] $array array of services | ||||
|    * @return void | ||||
|    */ | ||||
|   public static function current_status($array){ | ||||
|   public static function current_status($array): void{ | ||||
|     global $all, $some, $classes; | ||||
|     $statuses = array(0,0,0,0); | ||||
|     $worst = 5; | ||||
| @ -258,7 +258,7 @@ class Service implements JsonSerializable | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   public function jsonSerialize() { | ||||
|   public function jsonSerialize(): mixed { | ||||
|     global $statuses; | ||||
|     return [ | ||||
|       "id" => $this->id, | ||||
|  | ||||
| @ -190,7 +190,7 @@ Class Subscriber | ||||
|     { | ||||
|         global $mysqli; | ||||
| 
 | ||||
| 
 | ||||
|         // error_log(print_r($token, TRUE));
 | ||||
|         $stmt = $mysqli->prepare("SELECT subscriberID, token, userID, active, expires FROM subscribers WHERE token LIKE ? LIMIT 1"); | ||||
|         $stmt->bind_param("s", $token ); | ||||
|         $stmt->execute(); | ||||
| @ -202,7 +202,7 @@ Class Subscriber | ||||
|             // No data found, fail gently...
 | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         // error_log(print_r($row, TRUE));
 | ||||
|         // If account is not already active, check if we are within timeframe of exipre +2h
 | ||||
|         // and active if so, otherwise,delete account and return falsev
 | ||||
|         if ( $row['active'] <> 1 ) { | ||||
|  | ||||
| @ -210,12 +210,12 @@ class User | ||||
|   public static function login() | ||||
|   { | ||||
|     global $message, $mysqli; | ||||
|     if (!isset($_POST['email']) && !isset($_POST['email'])) | ||||
|     if (!isset($_POST['email']) && !isset($_POST['pass'])) | ||||
|     { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     if ((!isset($_POST['email']) || !isset($_POST['email']))) | ||||
|     if ((!isset($_POST['email']) || !isset($_POST['pass']))) | ||||
|     { | ||||
|       $message = _("Please fill in your email and password!"); | ||||
|       return; | ||||
|  | ||||
| @ -7,17 +7,26 @@ | ||||
| // This is needed because some hosts do not either unzip hidden files
 | ||||
| // or neither GitHub puts that file inside the zips.
 | ||||
| /********************************************************************/ | ||||
| $apacheExampleName = "ApacheHtaccess"; | ||||
| $apacheProductionName = ".htaccess"; | ||||
| $iisExampleName = "IISWebConfig"; | ||||
| $iisProductionName = "web.config"; | ||||
| if(stripos($_SERVER['SERVER_SOFTWARE'],'apache')!== false){ | ||||
| $f = fopen(".htaccess", "a+"); | ||||
| $f2 = fopen("ApacheHtaccess","r"); | ||||
| fwrite($f, fread($f2, filesize("ApacheHtaccess"))); | ||||
| fclose($f); | ||||
| fclose($f2); | ||||
|   if(!file_exists($apacheProductionName)) { | ||||
|     $f = fopen($apacheProductionName, "a+"); | ||||
|     $f2 = fopen($apacheExampleName,"r"); | ||||
|     fwrite($f, fread($f2, filesize($apacheExampleName))); | ||||
|     fclose($f); | ||||
|     fclose($f2); | ||||
|   } | ||||
| // skipping renaming file if it already exists
 | ||||
| } else { | ||||
| $f = fopen("web.config", "a+"); | ||||
| $f2 = fopen("IISWebConfig","r"); | ||||
| fwrite($f, fread($f2, filesize("IISWebConfig"))); | ||||
| fclose($f); | ||||
| fclose($f2); | ||||
|   if(!file_exists($iisProductionName)) { | ||||
|     $f = fopen($iisProductionName, "a+"); | ||||
|     $f2 = fopen($iisExampleName,"r"); | ||||
|     fwrite($f, fread($f2, filesize($iisExampleName))); | ||||
|     fclose($f); | ||||
|     fclose($f2); | ||||
|   } | ||||
| } | ||||
| ?>
 | ||||
|  | ||||
| @ -95,7 +95,7 @@ div.center { | ||||
| #wrapper | ||||
| { | ||||
| 	max-width: 1024px; | ||||
| 	min-height: calc(100vh - 157px); | ||||
| 	min-height: calc(100vh - 139px); | ||||
| 	padding-right: 15px; | ||||
| 	padding-left: 15px | ||||
| } | ||||
|  | ||||
							
								
								
									
										31
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| version: '3' | ||||
| 
 | ||||
| networks: | ||||
|   status-db: | ||||
| 
 | ||||
| services: | ||||
|   server-status: | ||||
|     build: . | ||||
|     volumes: | ||||
|       - ./:/var/www/html | ||||
|     ports: | ||||
|       - 4000:80 | ||||
|     networks: | ||||
|       - status-db | ||||
|   dbserver: | ||||
|     image: mysql | ||||
|     command: --default-authentication-plugin=mysql_native_password | ||||
|     environment: | ||||
|       MYSQL_ROOT_PASSWORD: e347h43cve89 | ||||
|       MYSQL_DATABASE: server_status | ||||
|     volumes: | ||||
|       - ./database:/var/lib/mysql | ||||
|     networks: | ||||
|       - status-db | ||||
|   mailhog: | ||||
|     image: mailhog/mailhog | ||||
|     ports: | ||||
|       - "1025:1025" | ||||
|       - "8025:8025" | ||||
|     networks: | ||||
|       - status-db | ||||
							
								
								
									
										24
									
								
								index.php
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								index.php
									
									
									
									
									
								
							| @ -40,14 +40,13 @@ define("TITLE", $db->getSetting($mysqli,"title")); | ||||
| define("WEB_URL", $db->getSetting($mysqli,"url")); | ||||
| define("MAILER_NAME", $db->getSetting($mysqli,"mailer")); | ||||
| define("MAILER_ADDRESS", $db->getSetting($mysqli,"mailer_email")); | ||||
| 
 | ||||
| define("SUBSCRIBE_EMAIL", $db->getBooleanSetting($mysqli,"subscribe_email")); | ||||
| define("SUBSCRIBE_TELEGRAM", $db->getBooleanSetting($mysqli,"subscribe_telegram")); | ||||
| define("TG_BOT_USERNAME", $db->getSetting($mysqli,"tg_bot_username")); | ||||
| define("TG_BOT_API_TOKEN", $db->getSetting($mysqli,"tg_bot_api_token")); | ||||
| define("GOOGLE_RECAPTCHA", $db->getBooleanSetting($mysqli,"google_recaptcha")); | ||||
| define("GOOGLE_RECAPTCHA_SITEKEY", $db->getSetting($mysqli,"google_recaptcha_sitekey")); | ||||
| define("GOOGLE_RECAPTCHA_SECRET", $db->getSetting($mysqli,"google_recaptcha_secret")); | ||||
| define("SUBSCRIBE_EMAIL", $db->getBooleanSetting($mysqli,"subscribe_email") ?: ""); | ||||
| define("SUBSCRIBE_TELEGRAM", $db->getBooleanSetting($mysqli,"subscribe_telegram") ?: ""); | ||||
| define("TG_BOT_USERNAME", $db->getSetting($mysqli,"tg_bot_username") ?: ""); | ||||
| define("TG_BOT_API_TOKEN", $db->getSetting($mysqli,"tg_bot_api_token") ?: ""); | ||||
| define("GOOGLE_RECAPTCHA", $db->getBooleanSetting($mysqli,"google_recaptcha") ?: ""); | ||||
| define("GOOGLE_RECAPTCHA_SITEKEY", $db->getSetting($mysqli,"google_recaptcha_sitekey") ?: ""); | ||||
| define("GOOGLE_RECAPTCHA_SECRET", $db->getSetting($mysqli,"google_recaptcha_secret") ?: ""); | ||||
| $offset = 0; | ||||
| 
 | ||||
| if (isset($_GET['ajax'])) | ||||
| @ -101,7 +100,7 @@ Template::render_header("Status"); | ||||
|     <?php $constellation->render_status();?>
 | ||||
|     </div> | ||||
| 
 | ||||
| <?php if ($mysqli->query("SELECT count(*) FROM status")->num_rows) | ||||
| <?php if ($mysqli->query("SELECT count(*) FROM status")) | ||||
| { | ||||
|   ?>
 | ||||
|       <div id="timeline"> | ||||
| @ -119,3 +118,10 @@ Template::render_header("Status"); | ||||
| 
 | ||||
| Template::render_footer(); | ||||
| } | ||||
| ?>
 | ||||
| <script> | ||||
| $(document).ready(function(){ | ||||
|   $('[data-toggle="tooltip"]').tooltip(); | ||||
| }); | ||||
| </script> | ||||
| <?php | ||||
| @ -12,7 +12,7 @@ function ordUTF8($c, $index = 0, &$bytes = null) | ||||
|     $bytes = 0; | ||||
|     if ($index >= $len) | ||||
|     return false; | ||||
|     $h = ord($c{$index}); | ||||
|     $h = ord($c[$index]); | ||||
|     if ($h <= 0x7F) { | ||||
|     $bytes = 1; | ||||
|     return $h; | ||||
| @ -21,18 +21,18 @@ function ordUTF8($c, $index = 0, &$bytes = null) | ||||
|     return false; | ||||
|     else if ($h <= 0xDF && $index < $len - 1) { | ||||
|     $bytes = 2; | ||||
|     return ($h & 0x1F) << 6 | (ord($c{$index + 1}) & 0x3F); | ||||
|     return ($h & 0x1F) << 6 | (ord($c[$index + 1]) & 0x3F); | ||||
|     } | ||||
|     else if ($h <= 0xEF && $index < $len - 2) { | ||||
|     $bytes = 3; | ||||
|     return ($h & 0x0F) << 12 | (ord($c{$index + 1}) & 0x3F) << 6 | ||||
|     | (ord($c{$index + 2}) & 0x3F); | ||||
|     return ($h & 0x0F) << 12 | (ord($c[$index + 1]) & 0x3F) << 6 | ||||
|     | (ord($c[$index + 2]) & 0x3F); | ||||
|     } | ||||
|     else if ($h <= 0xF4 && $index < $len - 3) { | ||||
|     $bytes = 4; | ||||
|     return ($h & 0x0F) << 18 | (ord($c{$index + 1}) & 0x3F) << 12 | ||||
|     | (ord($c{$index + 2}) & 0x3F) << 6 | ||||
|     | (ord($c{$index + 3}) & 0x3F); | ||||
|     return ($h & 0x0F) << 18 | (ord($c[$index + 1]) & 0x3F) << 12 | ||||
|     | (ord($c[$index + 2]) & 0x3F) << 6 | ||||
|     | (ord($c[$index + 3]) & 0x3F); | ||||
|     } | ||||
|     else | ||||
|     return false; | ||||
|  | ||||
| @ -52,5 +52,5 @@ | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <p style="text-align: center;"><a href="%url%/?do=unsubscribe&token=%token%"><sub><sup>%unsubscribe%</sup></sub></a></p> | ||||
| <p style="text-align: center;"><a href="%url%/?do=unsubscribe&type=2&token=%token%"><sub><sup>%unsubscribe%</sup></sub></a></p> | ||||
| <p style="text-align: center;"><a href="%url%"><img src="%url%/favicon/apple-icon-57x57.png" alt="" /> %powered_by% Server-Status</a></p> | ||||
							
								
								
									
										16
									
								
								template.php
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								template.php
									
									
									
									
									
								
							| @ -1,4 +1,11 @@ | ||||
| <?php | ||||
| 
 | ||||
| // enable this for debugging
 | ||||
| // error_reporting(E_ALL);
 | ||||
| // ini_set('display_startup_errors', 1);
 | ||||
| // ini_set('display_errors', 1);
 | ||||
| // ini_set("log_errors", 1);
 | ||||
| 
 | ||||
| $statuses = array(_("Major outage"), _("Minor outage"), _("Planned maintenance"), _("Operational") ); | ||||
| $classes = array("danger", "warning", "primary", "success" ); | ||||
| $icons = array("fa fa-times", "fa fa-exclamation", "fa fa-info", "fa fa-check" ); | ||||
| @ -26,7 +33,8 @@ class Template{ | ||||
|        if ( 'admin' == $str_url ) { | ||||
|            $strSubsMenu = ''; | ||||
|        } else { | ||||
|            if (SUBSCRIBE_EMAIL || SUBSCRIBE_TELEGRAM ) { | ||||
|         $strSubsMenu = ''; | ||||
|            if (defined('SUBSCRIBE_EMAIL') || defined('SUBSCRIBE_TELEGRAM') ) { | ||||
|                // Subscriber menu is to be shown...
 | ||||
|                $strSubsMenu = '<ul class="nav navbar-nav mr-auto">'; | ||||
|                // If subscriber is not logged on, display subscriber menus
 | ||||
| @ -56,9 +64,9 @@ class Template{ | ||||
|       <html lang="en"> | ||||
|       <head> | ||||
|        <?php | ||||
|        if(!admin){ | ||||
|        if(defined('admin') && !admin){ | ||||
|         $headfile = fopen("head.txt", "r") or die("Unable to open head.txt!"); | ||||
|         $head_additionalcode = fread($versionfile,filesize("head.txt")); | ||||
|         $head_additionalcode = fread($versionfile ?? "Version2Beta8",filesize("head.txt")); | ||||
|         fclose($headfile); | ||||
|         echo $head_additionalcode; | ||||
|         } | ||||
| @ -237,7 +245,7 @@ class Template{ | ||||
|     <?php }?>
 | ||||
|     <script src="<?php echo WEB_URL;?>/js/vendor/bootstrap.min.js"></script> | ||||
|     <script src="<?php echo WEB_URL;?>/js/main.js"></script> | ||||
|     <?php if ( GOOGLE_RECAPTCHA ) { ?><script src='https://www.google.com/recaptcha/api.js'></script><?php }?>
 | ||||
|     <?php if ( defined('GOOGLE_RECAPTCHA') ) { ?><script src='https://www.google.com/recaptcha/api.js'></script><?php }?>
 | ||||
|   </body> | ||||
|   </html> | ||||
| <?php | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user