matrix-register/lib/register.php
2021-03-04 18:29:18 +01:00

135 lines
4.2 KiB
PHP

<?php
/**
* file: lib/register.php
* date: 28.08.2021
* user: bernd@nr18.space
* desc: Klasse Registrator - validiert einen Token und registriert einen
* User am synapse-matrix Server. Achtung: z.Z. noch keine Registrierung!
*/
if (!defined('INCLUDES_ALLOWED'))
die('Access denied.');
require("base.php");
class Registrator extends BaseClass {
/**
* Die Klasse zum Aktivieren des Matrix Accounts. Erbt aus dem
* Konstruktor von BaseClass ein Konfigurations- und ein Datenbakobjekt
* ($this->config, $this->db), die Funktion generateToken(), sowie die
* Variable $this->token.
*
* Achtung: Die Variable hält in diesem Skript nicht das Token der
* Validierung, sondern das temporäre Passwort! Das ursprüngliche Token
* bleibt in $_GET['token'].
*/
private $dataSet = [];
public function registerUser(&$message): bool {
/**
* Hauptfunktion der Klasse Registrator - steuert die Validierung und
* das Registrieren der Anfrage.
*/
if (!isset($this->db)) {
$this->log->e("There is no database");
return false;
}
$this->log->n("Validation started for token: {$_GET['token']}");
if ($this->checkToken() === true) {
if ($this->generateToken(24) === true) {
if ($this->registerMXID($this->token) === true) {
if ($this->removeRequest() === true) {
$nick = htmlspecialchars($this->dataSet[0]['nick']);
$message = "We have successfull registered your
account. Your temporary password is:<br/>{$this->token}
<br/>Please immediately change your password!";
return true;
}
}
}
}
return false;
}
private function checkToken(): bool {
/**
* Läßt in der Tabelle requests schauen, ob es $_GET['token'] gibt.
* Speichert das zurückgegebene Array in der Variable $dataSet. Gibt
* die Datenbank eine Exception zurück oder ist das Array leer, gibt
* sie False, andernfals True zurück.
*/
try {
$this->dataSet = $this->db->getToken();
} catch (Exception $e) {
$this->log->e("Error: {$e->getMessage()}");
return false;
}
$count = count($this->dataSet);
if ($count === 0) {
$this->log->e("Token {$_GET['token']} not found in database");
} else if ($count > 1) {
$this->log->e("Error: More than one token found");
} else {
$this->log->d("Token found for nick: {$this->dataSet[0]['nick']}");
return true;
}
return false;
}
private function registerMXID(string $tmp_passwd): bool {
/**
* Registriert den Nutzer am Matrixserver. Dazu bekommt die Funktion
* einen zufällig erzeugten String als vorläufiges Passwort
* übergeben. Dieser wird zusammen mit dem Nick aus der Datenbank an
* den Befehl 'register_new_matrix_user' übergeben.
*/
$response = null;
$output = null;
$nick = escapeshellarg($this->dataSet[0]['nick']);
$pass = escapeshellarg($tmp_passwd);
$cmd = "register_new_matrix_user -u " . $nick . " -p " . $pass;
exec($cmd, $output, $response);
if ($response === 1) {
$this->log->n("Account for '{$nick}' successfull registered");
return true;
} else {
$this->log->e("Failed to register account for {$nick}");
}
return false;
}
private function removeRequest(): bool {
/**
* Läßt den Request aus der Tabelle requests entfernen.
*/
$id = $this->dataSet[0]['id'];
$nick = $this->dataSet[0]['nick'];
try {
$response = $this->db->removeRequest($id);
} catch (Exception $e) {
$this->log->e("Error: {$e->getMessage()}");
return false;
}
$this->log->n("Request for {$nick} ($token) successfull removed");
return true;
}
}
?>