Browse Source

Initial commit

Moritz Schmidt 10 năm trước cách đây
commit
21751e8735

BIN
images/logo.png


+ 11 - 0
includes/config.inc.php

@@ -0,0 +1,11 @@
+<?php
+
+$CONFIG = array(
+	"dbHost"		=>		"127.0.0.1",
+	"dbUser"		=>		"root",
+	"dbPassword"	=>		"root",
+	"dbDatabase"	=>		"atoffice"
+
+);
+
+?>

+ 80 - 0
includes/controller.inc.php

@@ -0,0 +1,80 @@
+<?php
+
+class Controller {
+
+	private $request 	= null;
+	private $template 	= '';
+	private $view 		= null;
+	private $headerView = null;
+	private $footerView = null;
+
+	/**
+	* Konstruktor, erstellet den Controller.
+	*
+	* @param Array $request Array aus $_GET & $_POST.
+	*/
+	public function __construct($request) {
+		global $user;
+		$this->view = new View();
+		$this->headerView = new View();
+		$this->footerView = new View();
+		$this->request = $request;
+		$this->template = !empty($request['action']) ? $request['action'] : 'default';
+
+		if(isset($request['action']) && $request['action'] === "login" && isset($request['username']))
+			$user->login($request['username'], $request['password']);
+
+		if(isset($request['action']) && $request['action'] === "logout")
+			$user->logout();
+	}
+
+	/**
+	* Methode zum anzeigen des Contents.
+	*
+	* @return String Content der Applikation.
+	*/
+	public function display() {
+		global $user;
+		$innerView = new View();
+		switch($this->template){
+			case 'login':
+				$innerView->setTemplate('login');
+				$entryid = $this->request['id'];
+				$entry = Model::getEntry($entryid);
+				$innerView->assign('title', $entry['title']);
+				$innerView->assign('content', $entry['content']);
+				break;
+			case 'profile':
+				$innerView->setTemplate('profile');
+				$openvpn = new OpenVPNStatus("/home/moritz/www/openvpn-status.log");
+				$clientName = $user->getClients();
+				$hostname = searchForHostname($clientName, $openvpn->logfile);
+				$innerView->assign('openvpn', $openvpn->logfile[$hostname]);
+				break;
+			case 'download':
+				$innerView->setTemplate('download');
+				break;
+			case 'label':
+				$innerView->setTemplate('label');
+				$innerView->assign('label', getLabelFromId($this->request['labelId']));
+				break;
+			case 'default':
+			default:
+				$entries = Model::getEntries();
+				$innerView->setTemplate('default');
+		}
+
+		$this->headerView->setTemplate('header');
+		$this->footerView->setTemplate('footer');
+		$this->view->setTemplate('matrix');
+		$this->headerView->assign('title', 'MMNxVPN');
+		$this->headerView->assign('request', $this->request);
+		$this->headerView->assign('labels', getLabels());
+		$this->view->assign('blog_title', $this->headerView->loadTemplate());
+		$this->view->assign('blog_footer', $this->footerView->loadTemplate());
+		$this->view->assign('blog_content', $innerView->loadTemplate());
+		return $this->view->loadTemplate();
+	}
+}
+
+?>

+ 35 - 0
includes/database.inc.php

@@ -0,0 +1,35 @@
+<?php
+
+class Database {
+
+	private $handle = null;
+
+	public function __construct($host, $user, $password, $db) {
+		$this->handle = new mysqli($host, $user, $password, $db);
+	}
+
+	public function close() {
+		$this->handle->Close();
+	}
+
+	public function query($query) {
+		$stmt = $this->handle->query($query);
+		if($stmt->num_rows == 0) {
+			$result = NULL;
+		} else {
+			$result = array();
+			while($res = $stmt->fetch_object()) {
+				$result[] = $res;
+			}
+		}
+
+		/*
+		elseif($stmt->num_rows == 1) {
+			$result = $stmt->fetch_object();
+		}
+		*/
+		return $result;
+	}
+}
+
+?>

+ 31 - 0
includes/functions.inc.php

@@ -0,0 +1,31 @@
+<?php
+
+// Label functions
+
+function getLabels() {
+	global $db;
+
+	$return = array();
+	$labels = $db->query("SELECT * FROM `labels`;");
+
+	foreach($labels as $label) {
+		$return[] = new Label($label->id, $label->name);
+	}
+
+	return $return;
+}
+
+function getLabelFromId($labelId) {
+	global $db;
+
+	$return = array();
+	$labels = $db->query("SELECT * FROM `labels` WHERE `id` = " . $labelId . ";");
+
+	foreach($labels as $label) {
+		$return[] = new Label($label->id, $label->name);
+	}
+
+	return $return;
+}
+
+?>

+ 21 - 0
includes/label.inc.php

@@ -0,0 +1,21 @@
+<?php
+class Label {
+    private $id = NULL;
+    private $name = '';
+
+    public function __construct($id, $name) {
+        $this->id = $id;
+        $this->name = $name;
+    }
+
+    public function getId() {
+        return $this->id;
+    }
+
+    public function getName() {
+        return $this->name;
+    }
+}
+
+
+?>

+ 38 - 0
includes/model.inc.php

@@ -0,0 +1,38 @@
+<?php
+/**
+* Klasse für den Datenzugriff
+*/
+class Model {
+
+	//Einträge eines Blogs als zweidimensionales Array
+	private static $entries = array(
+		array("title"=>"Eintrag 1", "content"=>"Ich bin der erste Eintrag.", "id"=>0),
+		array("title"=>"Eintrag 2", "content"=>"Ich bin der ewige Zweite!", "id"=>1),
+		array("title"=>"Eintrag 3", "content"=>"Na dann bin ich die Nummer drei.", "id"=>2)
+	);
+
+	/**
+	* Gibt alle Einträge des Blogs zurück.
+	*
+	* @return Array Array von Blogeinträgen.
+	*/
+	public static function getEntries(){
+		return self::$entries;
+	}
+
+	/**
+	* Gibt einen bestimmten Eintrag zurück.
+	*
+	* @param int $id Id des gesuchten Eintrags
+	* @return Array Array, dass einen Eintrag repräsentiert, bzw.
+	* 					wenn dieser nicht vorhanden ist, null.
+	*/
+	public static function getEntry($id){
+		if(array_key_exists($id, self::$entries)){
+			return self::$entries[$id];
+		}else{
+			return null;
+		}
+	}
+}
+?>

+ 116 - 0
includes/openvpn.inc.php

@@ -0,0 +1,116 @@
+<?php
+
+class OpenVPNStatus {
+	function __construct($logfile = NULL, $ippfile = NULL) {
+		if( file_exists( $logfile ) )
+		{
+			$this->parse_logfile( $logfile );
+		}
+
+		if( file_exists( $ippfile ) )
+		{
+			$this->parse_ippfile( $ippfile );
+		}
+	}
+
+	private function parse_logfile( $filename )	{
+		$contents = file_get_contents( $filename );
+		//echo "<h1>$filename</h1><pre>$contents</pre>";
+
+		/* Parse statusfile */
+		$log = array();
+		$log = explode("\n", $contents);
+		foreach($log as $entry)
+		{
+			$entry = explode(",", $entry);
+
+			if( sizeof($entry) == 5 )
+			{
+				$current_entry['hostname'] = $entry[0];
+				$current_entry['ip']       = $entry[1];
+				$current_entry['received'] = $this->bytesToSize($entry[2]);
+				$current_entry['send']     = $this->bytesToSize($entry[3]);
+				$current_entry['total']	   = $this->bytesToSize($entry[2] + $entry[3]);
+				$current_entry['date']     = $entry[4];
+
+				$this->logfile[] = $current_entry;
+			}
+		}
+
+		//echo '<pre>';
+		//echo var_dump( $this->logfile );
+		//echo '</pre>';
+		return $this->logfile;
+	}
+
+	private function parse_ippfile( $filename )	{
+		$contents = file_get_contents( $filename );
+		echo "<h1>$filename</h1><pre>$contents</pre>";
+
+		/* Parse hostfile */
+		$ipp = array();
+		$ipp = explode("\n", $contents);
+		foreach($ipp as $entry)
+		{
+			/* Dont process empty entries */
+			if( $entry == NULL )
+				break;
+
+			/* Split and organise entry */
+			$entry = explode(',', $entry);
+			$host['hostname']  = $entry[0];
+			$host['ip']        = $entry[1];
+			$host['remote_ip'] = "";
+			$host['date']      = "";
+			$host['received']  = "";
+			$host['send']      = "";
+
+			/* Check ipp against status log */
+			foreach($this->logfile as $entry)
+			{
+				if( $host['hostname'] == $entry['hostname'] )
+				{
+					$host['up']        = true;
+					$host['remote_ip'] = $entry['ip'];
+					$host['date']      = $entry['date'];
+					$host['received']  = $entry['received'];
+					$host['send']      = $entry['send'];
+					break;
+				}
+				else
+				{
+					$host['up'] = false;
+				}
+			}
+
+			/* Append entry */
+			$this->ippfile[] = $host;
+		}
+
+		echo '<pre>';
+		echo var_dump( $this->ippfile );
+		echo '</pre>';
+	}
+
+	private function bytesToSize($bytes, $precision = 2) {
+		$kilobyte = 1024;
+		$megabyte = $kilobyte * 1024;
+		$gigabyte = $megabyte * 1024;
+		$terabyte = $gigabyte * 1024;
+
+		if (($bytes >= 0) && ($bytes < $kilobyte))
+			return $bytes . ' B';
+		elseif (($bytes >= $kilobyte) && ($bytes < $megabyte))
+			return round($bytes / $kilobyte, $precision) . ' KB';
+		elseif (($bytes >= $megabyte) && ($bytes < $gigabyte))
+			return round($bytes / $megabyte, $precision) . ' MB';
+		elseif (($bytes >= $gigabyte) && ($bytes < $terabyte))
+			return round($bytes / $gigabyte, $precision) . ' GB';
+		elseif ($bytes >= $terabyte)
+			return round($bytes / $terabyte, $precision) . ' TB';
+		else
+			return $bytes . ' B';
+	}
+};
+
+?>

+ 58 - 0
includes/user.inc.php

@@ -0,0 +1,58 @@
+<?php
+
+Class User {
+
+	private $username 	= "";
+	private $password 	= "";
+	private $email 		= "";
+
+	public function __construct($username) {
+		if($username != NULL) {
+			$this->username = $username;
+		}
+
+	}
+
+	public function login($username, $password) {
+		global $db;
+		$this->username = $username;
+		$this->password = $password;
+
+		$user = $db->query("SELECT * FROM `users` WHERE `username` = '" . $username . "'");
+
+		if($user->password === md5($password)) {
+			$_SESSION['loggedIn'] = true;
+			$_SESSION['username'] = $this->username;
+			header("Location: http://vpn.mmnx.de/index.php?action=profile");
+		} else {
+			return false;
+		}
+
+	}
+
+	public function logout() {
+		$this->username = "";
+		$this->password = "";
+		$this->email = "";
+
+		$_SESSION['loggedIn'] = false;
+		unset($_SESSION['username']);
+		session_destroy();
+		header("Location: http://vpn.mmnx.de/index.php");
+	}
+
+	public function getClients() {
+		global $db;
+
+		//$clients = $db->query("SELECT * FROM `clients` WHERE `owned_by` = '" . $this->username . "'");
+
+		//sizeof($clients);
+
+		//return $clients->name;
+
+		return $this->username;
+	}
+
+}
+
+?>

+ 69 - 0
includes/view.inc.php

@@ -0,0 +1,69 @@
+<?php
+class View {
+
+	// Pfad zum Template
+	private $path = 'templates';
+	// Name des Templates, in dem Fall das Standardtemplate.
+	private $template = 'default';
+
+	/**
+	* Enthält die Variablen, die in das Template eingebetet
+	* werden sollen.
+	*/
+	private $_ = array();
+
+	/**
+	* Ordnet eine Variable einem bestimmten Schl&uuml;ssel zu.
+	*
+	* @param String $key Schlüssel
+	* @param String $value Variable
+	*/
+	public function assign($key, $value){
+		$this->_[$key] = $value;
+	}
+
+
+	/**
+	* Setzt den Namen des Templates.
+	*
+	* @param String $template Name des Templates.
+	*/
+	public function setTemplate($template = 'default'){
+		$this->template = $template;
+	}
+
+	/**
+	* Das Template-File laden und zurückgeben
+	*
+	* @param string $tpl Der Name des Template-Files (falls es nicht vorher
+	* 						über setTemplate() zugewiesen wurde).
+	* @return string Der Output des Templates.
+	*/
+	public function loadTemplate(){
+		$tpl = $this->template;
+		// Pfad zum Template erstellen & überprüfen ob das Template existiert.
+		$file = $this->path . DIRECTORY_SEPARATOR . $tpl . '.php';
+		$exists = file_exists($file);
+
+		if ($exists){
+			// Der Output des Scripts wird n einen Buffer gespeichert, d.h.
+			// nicht gleich ausgegeben.
+			ob_start();
+
+			// Das Template-File wird eingebunden und dessen Ausgabe in
+			// $output gespeichert.
+			include $file;
+			$output = ob_get_contents();
+			ob_end_clean();
+
+			// Output zurückgeben.
+			return $output;
+		}
+		else {
+			// Template-File existiert nicht-> Fehlermeldung.
+			return 'could not find template';
+		}
+	}
+}
+
+?>

+ 26 - 0
index.php

@@ -0,0 +1,26 @@
+<?php
+session_start();
+// Includes
+include('includes/config.inc.php');
+include('includes/database.inc.php');
+include('includes/user.inc.php');
+include('includes/controller.inc.php');
+include('includes/model.inc.php');
+include('includes/view.inc.php');
+include('includes/openvpn.inc.php');
+include('includes/functions.inc.php');
+include('includes/label.inc.php');
+
+$db = new Database($CONFIG['dbHost'], $CONFIG['dbUser'], $CONFIG['dbPassword'], $CONFIG['dbDatabase']);
+//$user = new User($_SESSION['username']);
+
+// $_GET und $_POST zusammenfasen
+$request = $_REQUEST;
+// Controller erstellen
+$controller = new Controller($request);
+// Inhalt der Webanwendung ausgeben.
+echo $controller->display();
+
+$db->close();
+
+?>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 5 - 0
scripts/bootstrap.min.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 11 - 0
scripts/docs.min.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1 - 0
scripts/jquery-2.1.3.min.js


+ 60 - 0
static/client.ovpn

@@ -0,0 +1,60 @@
+client
+
+dev tun
+proto tcp
+remote tarte.mmnx.de 1194
+resolv-retry infinite
+nobind
+persist-key
+persist-tun
+redirect-gateway def1
+
+<ca>
+-----BEGIN CERTIFICATE-----
+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
+-----END CERTIFICATE-----
+</ca>
+
+ns-cert-type server
+cipher AES-256-CBC
+comp-lzo
+
+verb 3
+mute 20
+
+auth-user-pass

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 4 - 0
styles/bootstrap.min.css


+ 105 - 0
styles/dashboard.css

@@ -0,0 +1,105 @@
+/*
+ * Base structure
+ */
+
+/* Move down content because we have a fixed navbar that is 50px tall */
+body {
+  padding-top: 50px;
+}
+
+
+/*
+ * Global add-ons
+ */
+
+.sub-header {
+  padding-bottom: 10px;
+  border-bottom: 1px solid #eee;
+}
+
+/*
+ * Top navigation
+ * Hide default border to remove 1px line.
+ */
+.navbar-fixed-top {
+  border: 0;
+}
+
+/*
+ * Sidebar
+ */
+
+/* Hide for mobile, show later */
+.sidebar {
+  display: none;
+}
+@media (min-width: 768px) {
+  .sidebar {
+    position: fixed;
+    top: 51px;
+    bottom: 0;
+    left: 0;
+    z-index: 1000;
+    display: block;
+    padding: 20px;
+    overflow-x: hidden;
+    overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
+    background-color: #f5f5f5;
+    border-right: 1px solid #eee;
+  }
+}
+
+/* Sidebar navigation */
+.nav-sidebar {
+  margin-right: -21px; /* 20px padding + 1px border */
+  margin-bottom: 20px;
+  margin-left: -20px;
+}
+.nav-sidebar > li > a {
+  padding-right: 20px;
+  padding-left: 20px;
+}
+.nav-sidebar > .active > a,
+.nav-sidebar > .active > a:hover,
+.nav-sidebar > .active > a:focus {
+  color: #fff;
+  background-color: #428bca;
+}
+
+
+/*
+ * Main content
+ */
+
+.main {
+  padding: 20px;
+}
+@media (min-width: 768px) {
+  .main {
+    padding-right: 40px;
+    padding-left: 40px;
+  }
+}
+.main .page-header {
+  margin-top: 0;
+}
+
+
+/*
+ * Placeholder dashboard ideas
+ */
+
+.placeholders {
+  margin-bottom: 30px;
+  text-align: center;
+}
+.placeholders h4 {
+  margin-bottom: 0;
+}
+.placeholder {
+  margin-bottom: 20px;
+}
+.placeholder img {
+  display: inline-block;
+  border-radius: 50%;
+}

+ 55 - 0
styles/style.css

@@ -0,0 +1,55 @@
+/*html, body {
+	background-color: #f5f5f5;
+	height: 100%;
+}
+
+body > .container {
+	background-color: #FFFFFF;
+	height: 100%;
+}
+
+.row {
+	margin-top: 5px;
+}
+
+.logo {
+	max-height: 42px;
+}
+
+.pleaselogin {
+	padding-top: 25%;
+}
+
+.signinbox {
+	max-width: 25%;
+	padding-top: 15%;
+}
+
+.form-signin input[type="text"] {
+	border-bottom-right-radius: 0;
+	border-bottom-left-radius: 0;
+}
+
+.form-signin input[type="password"] {
+	margin-bottom: 10px;
+	border-top-left-radius: 0;
+	border-top-right-radius: 0;
+}
+
+table tr > td:last-of-type {
+	text-align: right;
+	width: 50%;
+}*/
+
+.navbar-label-header {
+	font-weight: 600;
+}
+
+/*.footer {
+	position: absolute;
+	bottom: 0;
+	left: 0;
+	width: 100%;
+	height: 60px;
+	background-color: #f5f5f5;
+}*/

+ 166 - 0
templates/default.php

@@ -0,0 +1,166 @@
+<?php /*
+foreach($this->_['entries'] as $entry){
+?>
+
+	<h2><a href="?view=entry&id=<?php echo $entry['id'] ?>"><?php echo $entry['title']; ?></a></h2>
+	<p><?php echo $entry['content']; ?></p>
+
+<?php
+} */
+?>
+
+<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
+<h1 class="page-header">Dashboard</h1>
+
+<div class="row placeholders">
+	<div class="col-xs-6 col-sm-3 placeholder">
+	<img data-src="holder.js/200x200/auto/sky" class="img-responsive" alt="200x200" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxkZWZzLz48cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzBEOEZEQiIvPjxnPjx0ZXh0IHg9Ijc1LjUiIHk9IjEwMCIgc3R5bGU9ImZpbGw6I0ZGRkZGRjtmb250LXdlaWdodDpib2xkO2ZvbnQtZmFtaWx5OkFyaWFsLCBIZWx2ZXRpY2EsIE9wZW4gU2Fucywgc2Fucy1zZXJpZiwgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMHB0O2RvbWluYW50LWJhc2VsaW5lOmNlbnRyYWwiPjIwMHgyMDA8L3RleHQ+PC9nPjwvc3ZnPg==" data-holder-rendered="true">
+	<h4>Label</h4>
+	<span class="text-muted">Something else</span>
+	</div>
+	<div class="col-xs-6 col-sm-3 placeholder">
+	<img data-src="holder.js/200x200/auto/vine" class="img-responsive" alt="200x200" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxkZWZzLz48cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzM5REJBQyIvPjxnPjx0ZXh0IHg9Ijc1LjUiIHk9IjEwMCIgc3R5bGU9ImZpbGw6IzFFMjkyQztmb250LXdlaWdodDpib2xkO2ZvbnQtZmFtaWx5OkFyaWFsLCBIZWx2ZXRpY2EsIE9wZW4gU2Fucywgc2Fucy1zZXJpZiwgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMHB0O2RvbWluYW50LWJhc2VsaW5lOmNlbnRyYWwiPjIwMHgyMDA8L3RleHQ+PC9nPjwvc3ZnPg==" data-holder-rendered="true">
+	<h4>Label</h4>
+	<span class="text-muted">Something else</span>
+	</div>
+	<div class="col-xs-6 col-sm-3 placeholder">
+	<img data-src="holder.js/200x200/auto/sky" class="img-responsive" alt="200x200" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxkZWZzLz48cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzBEOEZEQiIvPjxnPjx0ZXh0IHg9Ijc1LjUiIHk9IjEwMCIgc3R5bGU9ImZpbGw6I0ZGRkZGRjtmb250LXdlaWdodDpib2xkO2ZvbnQtZmFtaWx5OkFyaWFsLCBIZWx2ZXRpY2EsIE9wZW4gU2Fucywgc2Fucy1zZXJpZiwgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMHB0O2RvbWluYW50LWJhc2VsaW5lOmNlbnRyYWwiPjIwMHgyMDA8L3RleHQ+PC9nPjwvc3ZnPg==" data-holder-rendered="true">
+	<h4>Label</h4>
+	<span class="text-muted">Something else</span>
+	</div>
+	<div class="col-xs-6 col-sm-3 placeholder">
+	<img data-src="holder.js/200x200/auto/vine" class="img-responsive" alt="200x200" src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxkZWZzLz48cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzM5REJBQyIvPjxnPjx0ZXh0IHg9Ijc1LjUiIHk9IjEwMCIgc3R5bGU9ImZpbGw6IzFFMjkyQztmb250LXdlaWdodDpib2xkO2ZvbnQtZmFtaWx5OkFyaWFsLCBIZWx2ZXRpY2EsIE9wZW4gU2Fucywgc2Fucy1zZXJpZiwgbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMHB0O2RvbWluYW50LWJhc2VsaW5lOmNlbnRyYWwiPjIwMHgyMDA8L3RleHQ+PC9nPjwvc3ZnPg==" data-holder-rendered="true">
+	<h4>Label</h4>
+	<span class="text-muted">Something else</span>
+	</div>
+</div>
+
+<h2 class="sub-header">Section title</h2>
+<div class="table-responsive">
+	<table class="table table-striped">
+	<thead>
+		<tr>
+		<th>#</th>
+		<th>Header</th>
+		<th>Header</th>
+		<th>Header</th>
+		<th>Header</th>
+		</tr>
+	</thead>
+	<tbody>
+		<tr>
+		<td>1,001</td>
+		<td>Lorem</td>
+		<td>ipsum</td>
+		<td>dolor</td>
+		<td>sit</td>
+		</tr>
+		<tr>
+		<td>1,002</td>
+		<td>amet</td>
+		<td>consectetur</td>
+		<td>adipiscing</td>
+		<td>elit</td>
+		</tr>
+		<tr>
+		<td>1,003</td>
+		<td>Integer</td>
+		<td>nec</td>
+		<td>odio</td>
+		<td>Praesent</td>
+		</tr>
+		<tr>
+		<td>1,003</td>
+		<td>libero</td>
+		<td>Sed</td>
+		<td>cursus</td>
+		<td>ante</td>
+		</tr>
+		<tr>
+		<td>1,004</td>
+		<td>dapibus</td>
+		<td>diam</td>
+		<td>Sed</td>
+		<td>nisi</td>
+		</tr>
+		<tr>
+		<td>1,005</td>
+		<td>Nulla</td>
+		<td>quis</td>
+		<td>sem</td>
+		<td>at</td>
+		</tr>
+		<tr>
+		<td>1,006</td>
+		<td>nibh</td>
+		<td>elementum</td>
+		<td>imperdiet</td>
+		<td>Duis</td>
+		</tr>
+		<tr>
+		<td>1,007</td>
+		<td>sagittis</td>
+		<td>ipsum</td>
+		<td>Praesent</td>
+		<td>mauris</td>
+		</tr>
+		<tr>
+		<td>1,008</td>
+		<td>Fusce</td>
+		<td>nec</td>
+		<td>tellus</td>
+		<td>sed</td>
+		</tr>
+		<tr>
+		<td>1,009</td>
+		<td>augue</td>
+		<td>semper</td>
+		<td>porta</td>
+		<td>Mauris</td>
+		</tr>
+		<tr>
+		<td>1,010</td>
+		<td>massa</td>
+		<td>Vestibulum</td>
+		<td>lacinia</td>
+		<td>arcu</td>
+		</tr>
+		<tr>
+		<td>1,011</td>
+		<td>eget</td>
+		<td>nulla</td>
+		<td>Class</td>
+		<td>aptent</td>
+		</tr>
+		<tr>
+		<td>1,012</td>
+		<td>taciti</td>
+		<td>sociosqu</td>
+		<td>ad</td>
+		<td>litora</td>
+		</tr>
+		<tr>
+		<td>1,013</td>
+		<td>torquent</td>
+		<td>per</td>
+		<td>conubia</td>
+		<td>nostra</td>
+		</tr>
+		<tr>
+		<td>1,014</td>
+		<td>per</td>
+		<td>inceptos</td>
+		<td>himenaeos</td>
+		<td>Curabitur</td>
+		</tr>
+		<tr>
+		<td>1,015</td>
+		<td>sodales</td>
+		<td>ligula</td>
+		<td>in</td>
+		<td>libero</td>
+		</tr>
+	</tbody>
+	</table>
+</div>
+</div>

+ 50 - 0
templates/download.php

@@ -0,0 +1,50 @@
+<div class="row">
+	<div class="col-md-12">
+		<h2>Download instructions</h2>
+		<ol>
+			<li>
+				Download <a target="_blank" href="http://openvpn.net/index.php/download/community-downloads.html">OpenVPN</a>
+			</li>
+			<li>
+				Install OpenVPN
+			</li>
+			<li>
+				Download <a href="static/client.ovpn">config</a> file and put it in <span class="text-muted">C:\Program Files\OpenVPN\config</span>
+			</li>
+			<li>
+				Start OpenVPN-Gui as <span class="text-muted">Admin</span>
+			</li>
+			<li>
+				Right-click OpenVPN's icon in the systray and select <span class="text-muted">connect</span>
+			</li>
+			<li>
+				Enter your username and password.
+			</li>
+			<li>
+				Hint: If you don't want to enter your username/password everytime, you connect follow these instructions:
+				<ol>
+					<li>
+						Navigate to <span class="text-muted">C:\Program Files\OpenVPN\config</span>
+					</li>
+					<li>
+						Open <span class="text-muted">client.ovpn</span> with your favorite text-editor
+					</li>
+					<li>
+						Append <span class="text-muted">up.txt</span> to <span class="text-muted">auth-user-pass</span> in the last line, then save
+					</li>
+					<li>
+						Create a new file <span class="text-muted">(up.txt)</span> in <span class="text-muted">C:\Program Files\OpenVPN\config</span>
+					</li>
+					<li>
+						Write your username in the first line, password in second line, for example:<br>
+						1337h4xx0r<br>
+						sUp3rs3(R3T
+					</li>
+					<li>
+						Connect again and OpenVPN shouldn't be asking for your username/password anymore
+					</li>
+				</ol>
+			</li>
+		</ol>
+	</div>
+</div>

+ 3 - 0
templates/entry.php

@@ -0,0 +1,3 @@
+<h2><?php echo $this->_['title']; ?></h2>
+<p><?php echo $this->_['content']; ?></p>
+<a href="?view=default">Zur&uuml;ck zur &Uuml;bersicht</a>

+ 13 - 0
templates/footer.php

@@ -0,0 +1,13 @@
+		</div>
+	</div>
+
+	<!-- Bootstrap core JavaScript
+	================================================== -->
+	<!-- Placed at the end of the document so the pages load faster -->
+	<script src="scripts/jquery-2.1.3.min.js"></script>
+	<script src="scripts/bootstrap.min.js"></script>
+	<script src="scripts/docs.min.js"></script>
+	<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
+	<!--<script src="./Dashboard Template for Bootstrap_files/ie10-viewport-bug-workaround.js"></script>-->
+	</body>
+</html>

+ 79 - 0
templates/header.php

@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html lang="de"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+	<meta charset="utf-8">
+	<meta http-equiv="X-UA-Compatible" content="IE=edge">
+	<meta name="viewport" content="width=device-width, initial-scale=1">
+	<meta name="description" content="">
+	<meta name="author" content="">
+	<link rel="icon" href="http://getbootstrap.com/favicon.ico">
+
+	<title>atOffice</title>
+
+	<!-- Bootstrap core CSS -->
+	<link href="styles/bootstrap.min.css" rel="stylesheet">
+
+	<!-- Custom styles for this template -->
+	<link href="styles/dashboard.css" rel="stylesheet">
+	<link href="styles/style.css" rel="stylesheet">
+
+	<!--<script src="./Dashboard Template for Bootstrap_files/ie-emulation-modes-warning.js"></script><style type="text/css"></style>-->
+
+	<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
+	<!--[if lt IE 9]>
+	<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+	<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+	<![endif]-->
+</head>
+
+<body>
+
+	<nav class="navbar navbar-inverse navbar-fixed-top">
+	<div class="container-fluid">
+		<div class="navbar-header">
+		<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
+			<span class="sr-only">Toggle navigation</span>
+			<span class="icon-bar"></span>
+			<span class="icon-bar"></span>
+			<span class="icon-bar"></span>
+		</button>
+		<a class="navbar-brand" href="?">atOffice</a>
+		</div>
+		<div id="navbar" class="navbar-collapse collapse">
+		<ul class="nav navbar-nav navbar-right">
+			<li><a href="">Dashboard</a></li>
+			<li><a href="">Einstellungen</a></li>
+			<li><a href="">Profil</a></li>
+			<li><a href="">Hilfe</a></li>
+		</ul>
+		<form class="navbar-form navbar-right">
+			<input type="text" class="form-control" placeholder="Search...">
+		</form>
+		</div>
+	</div>
+	</nav>
+
+	<div class="container-fluid">
+	<div class="row">
+		<div class="col-sm-3 col-md-2 sidebar">
+		<ul class="nav nav-sidebar">
+			<li class="active"><a href="?">Übersicht <span class="sr-only">(current)</span></a></li>
+		</ul>
+		<ul class="nav nav-sidebar">
+			<li class="navbar-label-header"><a href="?action=manage-labels">Labels</a></li>
+			<?php
+			foreach($this->_['labels'] as $label) {
+				if(isset($this->_['request']['action']) && $this->_['request']['action'] == 'label' && $_REQUEST['labelId'] == $label->getId()) {
+					echo '<li class="active"><a href="?action=label&labelId=' . $label->getId() . '">' . $label->getName() . '</a></li>';
+				} else {
+					echo '<li><a href="?action=label&labelId=' . $label->getId() . '">' . $label->getName() . '</a></li>';
+				}
+			}
+
+			?>
+		</ul>
+		<!--<ul class="nav nav-sidebar">
+			<li><a href="">Nav item again</a></li>
+			<li><a href="">One more nav</a></li>
+			<li><a href="">Another nav item</a></li>
+		</ul>-->
+		</div>

+ 35 - 0
templates/label.php

@@ -0,0 +1,35 @@
+<?php /*
+foreach($this->_['entries'] as $entry){
+?>
+
+    <h2><a href="?view=entry&id=<?php echo $entry['id'] ?>"><?php echo $entry['title']; ?></a></h2>
+    <p><?php echo $entry['content']; ?></p>
+
+<?php
+} */
+?>
+
+<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
+    <h1 class="page-header"><?php echo $this->_['label'][0]->getName(); ?></h1>
+
+    <div class="row placeholders">
+        <div role="tabpanel">
+            <!-- Nav tabs -->
+            <ul class="nav nav-tabs" role="tablist">
+                <li role="presentation" class="active"><a href="#home" aria-controls="home" role="tab" data-toggle="tab">Dokumente</a></li>
+                <li role="presentation"><a href="#profile" aria-controls="profile" role="tab" data-toggle="tab">Profile</a></li>
+                <li role="presentation"><a href="#messages" aria-controls="messages" role="tab" data-toggle="tab">Messages</a></li>
+                <li role="presentation"><a href="#settings" aria-controls="settings" role="tab" data-toggle="tab">Settings</a></li>
+            </ul>
+
+            <!-- Tab panes -->
+            <div class="tab-content">
+                <div role="tabpanel" class="tab-pane active" id="home">Dokumente</div>
+                <div role="tabpanel" class="tab-pane" id="profile">PROFILE</div>
+                <div role="tabpanel" class="tab-pane" id="messages">MESSAGE</div>
+                <div role="tabpanel" class="tab-pane" id="settings">SETTINGS</div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 19 - 0
templates/login.php

@@ -0,0 +1,19 @@
+<div class="row">
+	<div class="col-md-12">
+		<div class="center-block text-center signinbox">
+			<form action="?action=login" method="POST" class="form-signin">
+				<h2 class="form-signin-heading">Sign in</h2>
+				<label for="inputUsername" class="sr-only">Username</label>
+				<input type="text" id="inputUsername" name="username" class="form-control" placeholder="Username" required autofocus>
+				<label for="inputPassword" class="sr-only">Password</label>
+				<input type="password" id="inputPassword" name="password" class="form-control" placeholder="Password" required>
+				<!--<div class="checkbox">
+					<label>
+						<input type="checkbox" value="remember-me"> Remember me
+					</label>
+				</div>-->
+				<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
+			</form>
+		</div>
+	</div>
+</div>

+ 3 - 0
templates/matrix.php

@@ -0,0 +1,3 @@
+<?php echo $this->_['blog_title']; ?>
+<?php echo $this->_['blog_content']; ?>
+<?php echo $this->_['blog_footer']; ?>

+ 23 - 0
templates/profile.php

@@ -0,0 +1,23 @@
+<div class="row">
+	<div class="col-md-12">
+		<h3 class="text-muted text-center pleaselogin">Profile</h3>
+		<table>
+			<tr>
+				<td>Sent</td>
+				<td><?php echo $this->_['openvpn']['send']; ?></td>
+			</tr>
+			<tr>
+				<td>Received</td>
+				<td><?php echo $this->_['openvpn']['received']; ?></td>
+			</tr>
+			<tr>
+				<td>Total</td>
+				<td><?php echo $this->_['openvpn']['total']; ?></td>
+			</tr>
+			<tr>
+				<td>Logged on</td>
+				<td><?php echo date('j.n.Y G:i', strtotime('-2 hours', strtotime($this->_['openvpn']['date']))); ?> </td>
+			</tr>
+		</table>
+	</div>
+</div>

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác