27 Commits

Author SHA1 Message Date
Steffen-MLR 3171670a43 Merge pull request #172 from Steffen-MLR/master
PHP8 Support
2024-04-10 16:02:25 +02:00
Steffen Müller f942c4905e fix php8 error in user.php 2024-04-10 15:47:54 +02:00
Steffen Müller ee37419582 fix subscriptions feature for php8 and add mailhog 2024-04-10 15:42:19 +02:00
Steffen Müller 788ca4ccd0 add dev env for docker 2024-04-02 18:30:29 +02:00
Steffen Müller dbd918fd6f fix header and footer not showing 2024-04-02 18:20:19 +02:00
Steffen Müller 541555294b fix php error "needs to return an array" 2024-04-02 18:20:18 +02:00
Steffen Müller e7a294ef42 fix bottom empty space 2024-04-02 18:20:18 +02:00
Steffen-MLR c7003cfa32 Merge branch 'server-status-project:master' into master 2024-04-02 18:19:53 +02:00
Alexander Linares e0ff612569 Spanish translation (#173)
* Update lang es_ES

* Root fix for the Spanish language.

---------

Co-authored-by: Alexander Linares <alexander.linares@opperweb.com>
2024-01-12 09:23:25 +01:00
Steffen Müller 9d5ab1f0d2 more fixes 2023-06-20 17:32:10 +02:00
Steffen Müller 8731add072 fix double check issue with login function 2023-03-12 13:51:11 +01:00
Steffen Müller 8845ad65f0 fix PHP8 fatals 2023-03-12 13:50:28 +01:00
Steffen Müller 7601038f6b fix php8 error on undefined const 2023-03-12 13:49:19 +01:00
Steffen Müller 9ef3938e10 fix error if server configs are renamed already 2023-03-12 11:40:27 +01:00
Steffen Müller 5374602896 fix 'Array and string offset access using curly braces' deprecated error 2023-03-12 11:39:38 +01:00
Vojtěch Sajdl b2baa5051b Merge pull request #169 from kim3-sudo/master
Updated sorting, version number in README ( Fixes #168 )
2022-12-20 16:57:07 +01:00
Sejin Kim 9951c22d07 Update minimum version to PHP5.5
This version is not compatible with PHP 5.4 due to a constants handling issue. See [GH issue #168](https://github.com/server-status-project/server-status/issues/168)
2022-12-20 10:30:25 -05:00
Sejin Kim 2d65d0f9df Add sort for services for group then service 2022-12-20 10:26:39 -05:00
Vojtěch Sajdl c9bcbc241b Merge pull request #148 from Steffen-MLR/master
Fix for status api by correcting sql queries
2021-10-03 01:31:50 +02:00
Vojtěch Sajdl 184f803d6e Create SECURITY.md 2021-09-07 14:53:34 +02:00
Steffen Mueller 002bb13e10 Fix for status api by correcting sql queries 2021-04-22 09:16:30 +02:00
Yigit Kerem Oktay 9d3d14f67c Update README.md 2021-04-19 20:11:07 +03:00
Steffen Mueller 58b375161d Big fix for status api with parameter ID 2021-03-15 08:57:14 +01:00
Yigit Kerem Oktay f33bf996c6 Merge pull request #136 from server-status-project/dev
Release Developer branch to stable
2021-02-01 13:59:29 +03:00
Yigit Kerem Oktay 3e706233a4 Only make changes to files when not in development mode 2020-12-15 15:25:00 +03:00
Yigit Kerem Oktay 1408d0ad91 Bug fix for not allowing access to admin because of a file not found error 'head.txt' 2020-12-15 15:08:17 +03:00
Yiğit Kerem Oktay 8007097d2f Fix a graphical glitch 2020-11-24 16:07:23 +03:00
26 changed files with 819 additions and 537 deletions
+4
View File
@@ -0,0 +1,4 @@
config.php
.idea/
.vscode/
.code/
+3
View File
@@ -1,4 +1,7 @@
<?php
define("NAME", "");
define("TITLE", "");
define("WEB_URL", "");
require_once("template.php");
if (!file_exists("config.php"))
{
+32
View 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
+6 -6
View File
@@ -1,19 +1,19 @@
# Server Status Beta (Official)
## This is the official beta fork of Server Status by the contributors.
# Server Status (Official)
## This is the official Server Status Project.
![License](https://img.shields.io/github/license/Pryx/server-status.svg) ![Current release](https://img.shields.io/badge/version-2-blue)
![Beta-Build](https://img.shields.io/badge/latest_beta-Developmet_Beta_7-black)
![Beta-Stability](https://img.shields.io/badge/Beta_Stability-Fully_Stable_with_Visual_Imperfections-red)
![Stability](https://img.shields.io/badge/master_stability-Stable-red)
![Build](https://img.shields.io/badge/build-success-green)
<!--
## What does **contributor beta** mean?
It means the beta that is heavily unstable that is meant for contributors to make changes and use as a recovery point.
### Other Beta Type
### Other Beta Types
#### Development Beta
##### This beta has some bugs that are noticeable and is sometimes unstable. Best for new contributors
#### Public Beta
##### This beta has some bugs that are not really noticeable and mostly exist as bugs. Best for trying the new features before updating!
Very simple server status page written in PHP that can run on **PHP 5.4+** - even on **shared webhosting** even without shell access. Because why waste your money on another server (or host on a server that you might want to do maintenance on), when you can use cheap webhosting? And as a cherry on top - it works even without javascript!
-->
Very simple server status page written in PHP that can run on **PHP 5.5+** - even on **shared webhosting** even without shell access. Because why waste your money on another server (or host on a server that you might want to do maintenance on), when you can use cheap webhosting? And as a cherry on top - it works even without javascript!
## How do I install this thing?
Simply put the files on your server and access it from your browser. There will be a simple install dialog waiting for you.
+15
View File
@@ -0,0 +1,15 @@
# Security Policy
## Supported Versions
Only the latest version of server-status is being supported. Older versions won't recieve security updates.
## Reporting a Vulnerability
If you believe that you have have discovered a vulnerability you can report it by emailing the [lead maintainer](https://github.com/Pryx) at vojtech@sajdl.com.
Please include the keyword VULNERABILITY and the repository name in the subject of the email.
In the email, please describe your findings, the project versions you tested and were affected by the vulnerability and also include the full steps to reproduce it.
We appreciate your efforts to make server-status more secure and will try to do everytihing in our power to get the issues resolved as fast as possible. We will
keep you informed of the progress towards a fix.
+1 -1
View File
@@ -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{
+15 -16
View File
@@ -15,26 +15,25 @@ else{
$array = $constellation->render_status(true, false);
echo json_encode($array);
}else{
$query = $mysqli->prepare("SELECT name FROM services WHERE id=?");
$query->bind_param("i", $_GET['id']);
$query->execute();
$result = $query->get_result()->fetch_assoc();
// get id of service, check if service exists
$queryId = $mysqli->prepare("SELECT id from services where id = ?;");
$queryId->bind_param("i", $_GET['id']);
$queryId->execute();
$result = $queryId->get_result()->fetch_assoc();
if (!count($result))
{
die(json_encode(["error" => _("Service does not exist!")]));
}
$sql = $mysqli->prepare("SELECT type FROM services_status INNER JOIN status ON services_status.status_id = status.id WHERE service_id = ? AND `time` <= ? AND (`end_time` >= ? OR `end_time`=0) ORDER BY `time` DESC LIMIT 1");
$sql->bind_param("iii", $id, $timestamp, $timestamp);
$sql->execute();
$tmp = $sql->get_result();
if ($tmp->num_rows)
{
$service = new Service($_GET['id'], $result['name'], $tmp->fetch_assoc()['type']);
}
else{
$service = new Service($_GET['id'], $result['name']);
// get name, description and status.type (status of service) by id
$query = $mysqli->prepare("select services.id, name, description, status.type from services inner join status on status.id = services.id where services.id = ?;");
$query->bind_param("i", $_GET['id']);
$query->execute();
$result = $query->get_result()->fetch_assoc();
// if type is a number then return it, else just return the service name/desc
if (is_numeric($result["type"])) {
$service = new Service($_GET["id"], $result["name"], $result["description"], '', $result["type"]);
} else {
$service = new Service($_GET["id"], $result["name"], $result["description"]);
}
echo json_encode($service);
+4 -19
View File
@@ -69,11 +69,11 @@ 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");
$query = $mysqli->query("SELECT services.id, services.name, services.description, services_groups.name as group_name FROM services LEFT JOIN services_groups ON services.group_id=services_groups.id ORDER BY services_groups.name ");
$query = $mysqli->query("SELECT services.id, services.name, services.description, services_groups.name as group_name FROM services LEFT JOIN services_groups ON services.group_id=services_groups.id ORDER BY services_groups.name ASC, services.name;");
$array = array();
if ($query->num_rows){
$timestamp = time();
@@ -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;
+1 -1
View File
@@ -223,7 +223,7 @@ class Incident implements JsonSerializable
<?php
}
public function jsonSerialize() {
public function jsonSerialize():mixed {
return [
"id" => $this->id,
"date" => $this->timestamp,
-1
View File
@@ -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' => 'ଓଡ଼ିଆ',
+7 -2
View File
@@ -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();
+4 -4
View File
@@ -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() ) {
+3 -2
View File
@@ -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");
+2 -2
View File
@@ -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,
+2 -2
View File
@@ -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 ) {
+2 -2
View File
@@ -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;
+19 -10
View File
@@ -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);
}
}
?>
+5 -5
View File
@@ -64,9 +64,9 @@ a.desc-tool-tip, a.desc-tool-tip:hover, a.desc-tool-tip:visited {
background: gray;
}
.navbar-default {
z-index: 200;
background-color: gray;
border-color: transparent;
z-index: 200;
background-color: gray;
border-color: transparent;
border-radius: 0px 0px 30px 30px;
height: 77px;
position: fixed;
@@ -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
}
@@ -133,7 +133,7 @@ body a h1{
.status{
float: right;
box-sizing: border-box;
padding: 15px 35px;
padding: 0px 35px;
text-align: right;
font-size: 1.05em;
font-family: 'Fira Sans', sans-serif;
+31
View 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
+15 -9
View File
@@ -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
+14 -5
View File
@@ -9,6 +9,14 @@ define("COPYRIGHT_TEXT","");
require_once("classes/locale-negotiator.php");
require_once("classes/db-class.php");
$isDeveleoperEnvironement = false;
if(isset($_GET["isDev"])){
if($_GET["isDev"] == "devMode"){
$isDeveleoperEnvironement = true;
}
}
$negotiator = new LocaleNegotiator("en_GB");
$message = "";
$db = new SSDB();
@@ -161,11 +169,12 @@ if(isset($_POST['server']) && empty($message))
$db->setSetting($mysqli,"google_recaptcha_secret","");
$db->setSetting($mysqli,"google_recaptcha_sitekey","");
$db->setSetting($mysqli,"cron_server_ip","");
unlink("create-server-config.php");
unlink("config.php.template");
unlink("install.sql");
unlink(__FILE__);
if(!$isDeveleoperEnvironement) {
unlink("create-server-config.php");
unlink("config.php.template");
unlink("install.sql");
unlink(__FILE__);
}
header("Location: ".WEB_URL);
}
}
+7 -7
View File
@@ -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;
+1 -1
View File
@@ -52,5 +52,5 @@
</tr>
</tbody>
</table>
<p style="text-align: center;"><a href="%url%/?do=unsubscribe&amp;token=%token%"><sub><sup>%unsubscribe%</sup></sub></a></p>
<p style="text-align: center;"><a href="%url%/?do=unsubscribe&amp;type=2&amp;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="" />&nbsp;%powered_by%&nbsp;Server-Status</a></p>
Binary file not shown.
File diff suppressed because it is too large Load Diff
+20 -7
View File
@@ -1,6 +1,11 @@
<?php
//This should later be translatable, maybe find a better solution?
//This is here for better generation of POT files :)
// 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" );
@@ -28,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
@@ -58,9 +64,13 @@ class Template{
<html lang="en">
<head>
<?php
if(defined('admin') && !admin){
$headfile = fopen("head.txt", "r") or die("Unable to open head.txt!");
$head_additionalcode = fread($versionfile,filesize("head.txt"));
fclose($headfile); ?>
$head_additionalcode = fread($versionfile ?? "Version2Beta8",filesize("head.txt"));
fclose($headfile);
echo $head_additionalcode;
}
?>
<meta charset="utf-8">
<title><?php echo $page_name." - ".NAME ?></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
@@ -174,6 +184,9 @@ class Template{
/**
* Renders a toggle switch
* Created by Yigit Kerem Oktay
* @param String $toggletext will decide what the description text next to the toggle will be
* @param String $input_name will decide what the HTML Name attribute of the toggle will be
* @param Boolean $checked will decide if the toggle will initially be on or off
*/
public static function render_toggle($toggletext,$input_name,$checked){
?>
@@ -199,7 +212,7 @@ class Template{
<div id="footerwrap">
<div class="container">
<div class="row centered">
<div class="col-md-4 text-left"><a href="https://github.com/Pryx/server-status/graphs/contributors" target="_blank">Copyright © <?php echo date("Y");?> Server Status Project Contributors </a><?php if(strlen(COPYRIGHT_TEXT)>1){ echo " and ".COPYRIGHT_TEXT; } ?></div>
<div class="col-md-4 text-left"><a href="https://github.com/server-status-project/server-status/graphs/contributors" target="_blank">Copyright © <?php echo date("Y");?> Server Status Project Contributors </a><?php if(strlen(COPYRIGHT_TEXT)>1){ echo " and ".COPYRIGHT_TEXT; } ?></div>
<div class="col-md-4 text-center">
<div class="btn-group dropup">
<button type="button" class="btn btn-primary"><?php echo '<img src="'.WEB_URL.'/locale/'.$_SESSION['locale'].'/flag.png" alt="'.$lang_names[$_SESSION['locale']].'">'.$lang_names[$_SESSION['locale']];?></button>
@@ -232,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