mirror of
				https://github.com/ShaYmez/FreeSTAR-Status-Engine.git
				synced 2025-11-03 20:20:20 -05: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