', '
'),
// in the $block->body text
$block->body
);
//Assign the rendered view to content variables to show up on page-block-type-x.inc
$template->set('content', $content);
$template->set('headline', $block->get('title'));
//Get the output and save it on $out.
$out .= $template->render();
}
return $out;
}
function renderSidebarFilter(){
$hersteller = listPages(wire('pages')->find("template=hersteller"));
$features = listPages(wire('pages')->find("template=features"));
$output = "";
return $output;
}
// Render a Page Title
function renderPageName($title){
$sanitizer = wire('sanitizer');
$string = iconv("UTF-8", "ASCII//TRANSLIT", $title);
$string = preg_replace("/\s+/", " ", $string); // Überflüssige Leerzeichen entfernen
$string = trim($string); // Leerzeichen am Anfang und Ende entfernen
$string = $sanitizer->pageName($string);
return $string;
}
function renderNewNodesList(){
$nodes = wire('pages')->find("template=node, sort=-created, limit=10");
$list = "";
foreach($nodes as $node){
$color = ($node->online ? "green" : "red");
$alt = ($node->online ? "Online" : "Offline");
$list .= "- {$node->get('subtitle|title')}";
$list .= ($node->address ? "
{$node->address} " : "");
}
$output = "Neuste Nodes
";
return $output;
}
#########################################################
# Mac Address Handling
#########################################################
function validateMac($mac){
// trim
$mac = trim($mac);
// 01:23:45:67:89:ab
if (preg_match('/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/', $mac))
return true;
// 01_23_45_67_89_ab
if (preg_match('/^([a-fA-F0-9]{2}_){5}[a-fA-F0-9]{2}$/', $mac))
// 01-23-45-67-89-ab
if (preg_match('/^([a-fA-F0-9]{2}\-){5}[a-fA-F0-9]{2}$/', $mac))
return true;
// 0123456789ab
else if (preg_match('/^[a-fA-F0-9]{12}$/', $mac))
return true;
// 0123.4567.89ab
else if (preg_match('/^([a-fA-F0-9]{4}\.){2}[a-fA-F0-9]{4}$/', $mac))
return true;
else
return false;
}
function normalizeMac($mac){
// trim
$mac = trim($mac);
// remove any dots
$mac = str_replace(".", ":", $mac);
// remove any underscore
$mac = str_replace("_", ":", $mac);
// replace dashes with colons
$mac = str_replace("-", ":", $mac);
// counting colons
$colon_count = substr_count ($mac , ":");
// insert enough colons if none exist
if ($colon_count == 0)
{
$mac = substr_replace($mac, ":", 2, 0);
$mac = substr_replace($mac, ":", 5, 0);
$mac = substr_replace($mac, ":", 8, 0);
$mac = substr_replace($mac, ":", 11, 0);
$mac = substr_replace($mac, ":", 14, 0);
}
// uppercase
$mac = strtoupper($mac);
// DE:AD:BE:EF:10:24
return $mac;
}
function serializeMac($serialize){
$serialize = getPageArray($serialize);
$serialize_array = array();
foreach($serialize as $one){
$serialize_array[] = array('mac' => strtolower(str_replace(":", "", $one->title)),
'staticip' => strtoupper($one->static_ip));
}
return serialize($serialize_array);
}
##########################################################
# Page and User handling
#########################################################
function listPages(PageArray $pages){
$output = "";
foreach($pages as $page){
$output .= "- {$page->title}
";
}
return $output;
}
/**
* Function to Create Processwire Pages
*
* @param string $template the template for the new page
* @param Page/string $parent parent Page can be a Page or string
* @param string $title Title of the new Page
* @return PageArray The new Page
*/
function createPage($template, $parent, $title){
if(!$parent instanceof Page) $parent = wire('pages')->get("/$parent/"); // Wenn keine Seite übergeben wird suche eine raus.
$pageName = renderPageName($title);
$t = new Page();
$t->template = $template;
$t->parent = $parent;
$t->name = $pageName;
$t->title = $title;
$t->save();
return $t;
}
/**
* Fucntion to handle Node registration
*
* @param string $mac the MAC Address from the Node
* @param string $key the Node PublicKey for the VPN connection_status
* @return int -1 = Existiert bereits; 0 = Fehler; 1 = true; 2 = aktualisiert
*/
function registerNode($mac, $key){
if(empty($mac) || empty($key)) return 0;
// Definiere Systemvariablen
$page = wire('page');
$node = wire('pages')->get("template=node, title=$mac");
$parent = wire('pages')->get($page->id);
$operator = wire('user')->id;
// Existiert der Node bereits?
if($node instanceof Nullpage){
$titlemac = strtoupper($mac);
$n = createPage('node', $parent, $titlemac);
$fehlercode = 1;
} elseif($node->operator->id != $operator) {
// Checke ob der Node vom Besitzer geändert wird.
wire('log')->save('node', "Node $mac existiert bereits!");
return -1;
} else {
$n = $node;
$fehlercode = 2;
}
$n->key = $key;
$n->operator = $operator;
$n->of(false);
$n->save();
$n->of(true);
// Remove key and mac from the session!
wire('session')->remove('key');
wire('session')->remove('mac');
return $fehlercode;
}
/**
* deleteNode deletes one ore more nodes.
*/
function deleteNode($posts){
// Erzeuge ein Array aus $posts
if(!$posts instanceof PageArray){
if($posts instanceof Page){
$post = $posts;
$posts = new PageArray();
$posts->add($post);
} else if(empty($posts)){
$post = wire('page');
$posts = new PageArray();
$posts->add($post);
} else if(is_string($posts)){
// selector string
$selector = $posts;
$posts = wire('pages')->find("$selector");
}
}
foreach($posts as $post){
if($post->template != "node") break; // Only for nodes
$pages = wire('pages');
$pages->delete($post, true);
}
return true;
}
function registerUser($u){
// inizialisation ldapHelper Module for Ldap Registration
$ldapHelper = wire('modules')->get("ldapHelper");
if(!wire('users')->get($u["username"]) instanceof NullPage) return "Der Benutzer mit dem Namen {$u["username"]} existiert bereits.
";
if(!wire('users')->get("email={$u["email"]}") instanceof NullPage) return "Die E-Mail {$u["email"]} wird bereits verwendet.
";
if(!$ldapHelper->ldapHelperRegistradeUser($u)) return "Das Anlegen eines LDAP Users hat leider nicht funktioniert. Bitte versuche es zu einem späteren Zeitpunkt noch einmal.
";
$new_user = new User();
$new_user->of(false);
$new_user->name = $u["username"];
$new_user->email = $u["email"];
$new_user->pass = $u["password"];
$new_user->addRole("user");
$new_user->firstname = $u["firstname"];
$new_user->lastname = $u["lastname"];
$new_user->admin_theme = "AdminThemeReno";
$new_user->authkey = getToken();
$new_user->save();
$new_user->of(true);
$aktivierungslink = wire('page')->httpUrl ."?authkey=". $new_user->authkey ."&user=". $new_user->name;
$mail = wireMail();
$mail->to($u["email"])->from('registration@ffmyk.de');
$mail->subject("Account Aktivierung");
$mail->body("===== Account Aktivierung ===== \n\n
mit dieser E-Mail kannst du deinen soeben eingerichteten Account bei Freifunk-Myk aktivieren.\n
$aktivierungslink \n
Sollte der Link nicht anklickbar sein, kopiere ihn und füge ihn in die Adresszeile deines Browsers ein.");
if($mail->send()) wire('log')->message('Send Mail: Account Aktivierung') ;
$session = wire('session');
$session->remove('username');
$session->remove('email');
$session->remove('firstname');
$session->remove('lastname');
return "Die Registrierung war erfolgreich, du erhälst nun eine E-Mail mit einem Aktivierungslink.
";
}
#################################################
# secret
#################################################
function authorize($auth_user, $secret){
if($auth_user->authkey === $secret && $auth_user->authsuccess != true){
$auth_user->of(false);
$auth_user->authsuccess = true;
$auth_user->save();
$auth_user->of(true);
$mail = wireMail();
$mail->to($auth_user->email)->from('registration@ffmyk.de');
$mail->subject("Herzlich Wilkommen");
$mail->body("===== Wilkommen bei Freifunk-Myk ===== \n\n
Wir freuen uns dich bei Freifunk-Myk begrüßen zu dürfen. Im Folgenden erklären wir dir die Besonderheiten deines Accounts. \n\n
=== Mehr als nur ein Account === \n
Mit deinem Account bei Freifunk-Myk kannst du dich nicht nur auf unserer Webseite, sondern bei vielen weiteren Diensten im Freifunk-Myk einloggen.\n
Ob Router registrieren, Wiki editieren oder dich im Jabber zu unterhalten. Alles mit einem Account.\n\n
=== Jabber ===\n
Jabber ist ein föderalisiertes Chatsystem. Es stehten Clients für Computer, Smartphones und andere Geräte bereit.
Du besitzt mit der Registrierung auf Freifunk-Myk direkt einen Jabber Account mit der folgenden ID: {$auth_user->name}@ffmyk.de und deinem Passwort.
Wenn du dich einloggst findest du in deiner Kontaktliste direkt eine Liste der Administratoren und kannst dich mit ihnen unterhalten.\n\n
Das Freifunk-Myk Team wünscht dir viel Spaß und freut sich auf deine Mitarbeit.");
if($mail->send()) wire('log')->message("Send Mail: Welcome to {$auth_user->email} ") ;
return "
Dein Account ist erfolgreich Aktiviert. Wir senden dir noch eine Wilkommens E-Mail in der du wichtige Informationen zu unseren Diensten und zu deinem Account findest.
";
} else {
return "
Dein Account wurde bereits Aktiviert.
";
}
}
function crypto_rand_secure($min, $max) {
$range = $max - $min;
if ($range < 0) return $min; // not so random...
$log = log($range, 2);
$bytes = (int) ($log / 8) + 1; // length in bytes
$bits = (int) $log + 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd >= $range);
return $min + $rnd;
}
function getToken($length=32){
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
for($i=0;$i<$length;$i++){
$token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
}
return $token;
}
/**
* Return a Page from searched Router
*
* return Page
*/
function getRouter($search){
$pages = wire('pages');
$sanitizer = wire('sanitizer');
$search = explode(" ",$search);
foreach($search as $string){
$result = $pages->get("template=router, name|title={$sanitizer->pageName($string)}");
if($result->id) break;
}
if($result instanceof NullPage) return false;
return $result;
}
/**
* Umkreissuche für Nodes
* read: https://www.tutorials.de/threads/umkreis-um-eine-koordinate-berechnen-und-alle-koordinaten-in-db-suchen.217768/
*
* String latitude
* String longitude
* Int dist Distance
*
* return String Processwire Selector
*/
function umkreissuche($template, $latitude, $longitude, $dist = 5, $sort = true){
// Return if the Template dosn't exists
if(!wire('templates')->get("$template")) return;
$t = wire('templates')->get("$template");
// Return if Template didn't has latitude or longitude field!
if(!$t->hasField('latitude')) return;
$ursprungsbreite = str_replace(",", ".", $latitude);
$ursprungslaenge = str_replace(",", ".", $longitude);
$alpha = 180*$dist/(6371*3.14159);
$geo1 = $ursprungsbreite-$alpha;
$geo2 = $ursprungsbreite+$alpha;
$geo3 = $ursprungslaenge-$alpha;
$geo4 = $ursprungslaenge+$alpha;
// Ungenaue suche
$search = wire('pages')->find("template=$template, latitude>=$geo1, latitude<=$geo2, longitude>=$geo3, longitude<=$geo4");
$result = new PageArray();
$a = $ursprungsbreite/180*3.14159;
$b = $ursprungslaenge/180*3.14159;
$z = 1;
foreach($search as $value){
$c = str_replace(',','.',$value->latitude);
$d = str_replace(',','.',$value->longitude);
$c = $c/180*3.14159;
$d = $d/180*3.14159;
$e = sin($a)*sin($c);
$f = cos($a)*cos($c)*cos($d-$b);
$g = acos($e + $f);
$h = $g * 6378.137;
$ausgabe = sprintf("%01.3f", $h);
if($ausgabe > $dist || $h == 0) {
continue;
}
$value->set('dist', $ausgabe);
$result->add($value);
}
if($sort){
$result = $result->sort('dist');
}
return $result;
}
function getDistance($dist){
$a = array( 'km' => 1,
'm' => 0.001);
foreach ($a as $metric => $key) {
$b = $dist / $key;
if (intval($b) >= 1){
$b = round($b, 2);
$ausgabe = "$b $metric";
break;
} else {
$ausgabe = "> 1 m";
}
}
return $ausgabe;
}
/**
* Author : Ayman Hussein
* http://stackoverflow.com/questions/1416697/converting-timestamp-to-time-ago-in-php-e-g-1-day-ago-2-days-ago
*/
function time_elapsed_string($ptime){
$etime = time() - $ptime;
if ($etime < 1){
return '0 seconds';
}
$a = array( 365 * 24 * 60 * 60 => 'year',
30 * 24 * 60 * 60 => 'month',
24 * 60 * 60 => 'day',
60 * 60 => 'hour',
60 => 'minute',
1 => 'second'
);
$a_plural = array( 'year' => 'Jahre',
'month' => 'Monate',
'day' => 'Tage',
'hour' => 'Stunden',
'minute' => 'Minuten',
'second' => 'Sekunden'
);
foreach ($a as $secs => $str){
$d = $etime / $secs;
if ($d >= 1){
$r = round($d);
return 'seit '. $r . ' ' . ($r > 1 ? $a_plural[$str] : $str);
}
}
}