Advertisement
Guest User

Untitled

a guest
Jul 26th, 2018
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 16.42 KB | None | 0 0
  1. <?php
  2. namespace MSN\Authentication;
  3.  
  4. /*
  5.  * PHP Authentifizierungs-API von Martins Servernetzwerk
  6.  * Copyright (C) 2018 Martin Michael Griesbeck
  7.  *
  8.  * Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public
  9.  * License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren,
  10.  * entweder gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
  11.  *
  12.  * Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird,
  13.  * aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der
  14.  * VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
  15.  *
  16.  * Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben.
  17.  * Falls nicht, siehe <http://www.gnu.org/licenses/>.
  18.  */
  19.  
  20.  use \mysqli;
  21.  
  22. /**
  23.  * Die Klasse, die für die Datenbankverbindung und alle Abfragen zur Datenbank zuständig ist.
  24.  * Zusätzlich enthält die Klasse nützliche Methoden, deren Nutzen in der Verarbeitung der
  25.  * gewonnen Daten liegt.
  26.  */
  27. class MSN_Authentication
  28. {
  29.   /**
  30.    * @var string Beinhaltet die Adresse des Datenbankservers (Standard: "localhost")
  31.    */
  32.   protected $msn_db_address = "localhost";
  33.  
  34.   /**
  35.    * @var string Beinhaltet den Namen der Authentifizierungsdatenbank (Standard: "msn_auth")
  36.    */
  37.   protected $msn_db_name = "msn_auth";
  38.  
  39.   /**
  40.    * @var string Beinhaltet den Benutzernamen, der zum Aufbau der Verbindung zur Authentifizierungsdatenbank benötigt wird (Standard: "root")
  41.    */
  42.   protected $msn_db_username = "root";
  43.  
  44.   /**
  45.    * @var string Beinhaltet das Passwort, das zum Aufbau der Verbindung zur Authentifizierungsdatenbank benötigt wird (Standard: "")
  46.    */
  47.   protected $msn_db_password = "";
  48.  
  49.   /**
  50.    * @var \mysqli Die Verbindung zur Authentifizierungsdatenbank
  51.    */
  52.   protected $mysqli = null;
  53.  
  54.   /**
  55.    * @var bool Sagt aus, ob die Verbindung zur Authentifizierungsdatenbank zum Zeitpunkt der Abfrage schon hergestellt wurde
  56.    */
  57.   protected $connection_established = false;
  58.  
  59.   /**
  60.    * Konstruktur für die MSN_Authentication Klasse
  61.    *
  62.    * @param string $msn_db_address Adresse der Authentifizierungsdatenbank
  63.    * @param string $msn_sb_name Name der Authentifizierungsdatenbank
  64.    * @param string $msn_db_username Benutzername zum Zugriff auf die Authentifizierungsdatenbank
  65.    * @param string $msn_db_password Passwort zum Zugriff auf die Authentifizierungsdatenbank
  66.    */
  67.   public function __construct(string $msn_db_address = "localhost", string $msn_db_name = "msn_auth", string $msn_db_username = "root", string $msn_db_password = "")
  68.   {
  69.     $this->msn_db_address = $msn_db_address;
  70.     $this->msn_db_name = $msn_db_name;
  71.     $this->msn_db_username = $msn_db_username;
  72.     $this->msn_db_password = $msn_db_password;
  73.   }
  74.  
  75.   /**
  76.    * Baut die Verbindung zur Authentifizierungsdatenbank auf
  77.    *
  78.    * @return void
  79.    * @throws \Exception Wirft einen Fehler, wenn der Verbindugsaufbau nicht gelingt
  80.    */
  81.   public function establish_connection()
  82.   {
  83.     @ $mysqli = new mysqli($this->msn_db_address,$this->msn_db_username,$this->msn_db_password,$this->msn_db_name);
  84.     @ $mysqli->set_charset("utf8");
  85.  
  86.     if($mysqli->connect_errno) trigger_error("Unable to connect to the authentication database", E_USER_ERROR);
  87.  
  88.     $this->mysqli = $mysqli;
  89.     $this->connection_established = true;
  90.   }
  91.  
  92.   /**
  93.    * Überprüft, ob eine Verbindung zur Authentifizierungsdatenbank besteht, und wirft einen Fehler, wenn nicht!
  94.    *
  95.    * @return void
  96.    * @throws \Exception Wirft einen Fehler, wenn noch keine Verbindung zur Authentifizierungsdatenbank eröffnet wurde
  97.    */
  98.   public function require_connection()
  99.   {
  100.     if(!$this->connection_established) trigger_error("No established connection to the authentication database", E_USER_ERROR);
  101.   }
  102.  
  103.   /**
  104.    * Erstellt einen Benutzer in der Authentifizierungsdatenbank
  105.    *
  106.    * @param string $name Eindeutiger Benutzername
  107.    * @param string $password Ungehashtes Passwort des Benutzers
  108.    * @param int $gid Gruppen-ID des neuen Benutzers (Standard: 1)
  109.    * @return MSN_User Neu erstellter Benutzer
  110.    * @return null Wenn der Benutzer nicht erstellt werden konnte
  111.    */
  112.   public function create_user(string $name, string $password, int $gid = 1)
  113.   {
  114.     $this->require_connection();
  115.     $mysqli = $this->mysqli;
  116.  
  117.     if($this->query_user_from_name($name) != null)
  118.       return null;
  119.  
  120.     $query = "INSERT INTO auth_user (name,password,gid) VALUES (\"" . $mysqli->real_escape_string($name) . "\",\"" . md5($mysqli->real_escape_string($password)) . "\"," . $mysqli->real_escape_string($gid) . ")";
  121.     $result = $mysqli->query($query);
  122.  
  123.     if ($result) return $this->query_user($mysqli->insert_id); else return null;
  124.   }
  125.  
  126.   /**
  127.    * Erstellt eine Gruppe in der Authentifizierungsdatenbank
  128.    *
  129.    * @param string $name Eindeutiger Gruppenname
  130.    * @return MSN_Group Neu erstellte Gruppe
  131.    * @return null Wenn die Gruppe nicht erstellt werden konnte
  132.    */
  133.   public function create_group(string $name)
  134.   {
  135.     $this->require_connection();
  136.     $mysqli = $this->mysqli;
  137.  
  138.     if($this->query_group_from_name($name) != null)
  139.       return null;
  140.  
  141.     $query = "INSERT INTO auth_group (name) VALUES (\"" . $mysqli->real_escape_string($name) . "\")";
  142.     $result = $mysqli->query($query);
  143.  
  144.     if ($result) return $this->query_group($mysqli->insert_id); else return null;
  145.   }
  146.  
  147.   /**
  148.    * Erstellt eine Berechtigung in der Authentifizierungsdatenbank
  149.    *
  150.    * @param string $pid Eindeutiger Berechtigungsidentifikationsname
  151.    * @param string $default_value Standardwert für die Berechtigung
  152.    * @return MSN_Permission Neu erstellte Berechtigung
  153.    * @return null Wenn die Berechtigung nicht erstellt werden konnte
  154.    */
  155.   public function create_permission(string $pid, string $default_value)
  156.   {
  157.     $this->require_connection();
  158.     $mysqli = $this->mysqli;
  159.  
  160.     if($this->query_permission($pid) != null)
  161.       return null;
  162.  
  163.     $query = "INSERT INTO auth_permission (pid,default_value) VALUES (\"" . $mysqli->real_escape_string($pid) . "\",\"" . $mysqli->real_escape_string($default_value) . "\")";
  164.     $result = $mysqli->query($query);
  165.  
  166.     if ($result) return $this->query_permission($pid); else return null;
  167.   }
  168.  
  169.   /**
  170.    * Setzt eine Gruppenberechtigung
  171.    *
  172.    * @param MSN_Group $group Gruppe, dessen Recht gesetzt werden soll
  173.    * @param MSN_Permission $permission Recht, das gesetzt werden soll
  174.    * @param string $value Wert, auf den die Berechtigung gesetzt werden soll
  175.    * @return bool War es möglich, die Berechtigung zu setzen?
  176.    */
  177.   public function set_group_permission(MSN_Group $group, MSN_Permission $permission, string $value)
  178.   {
  179.     $this->require_connection();
  180.     $mysqli = $this->mysqli;
  181.  
  182.     if($this->query_group_permission($group,$permission) != null)
  183.       $query = "UPDATE auth_permissions_group SET value = \"" . $mysqli->real_escape_string($value) . "\" WHERE gid = " . $mysqli->real_escape_string($group->gid) . " AND pid = \"" . $mysqli->real_escape_string($permission->pid) . "\"";
  184.     else
  185.       $query = "INSERT INTO auth_permissions_group (gid,pid,value) VALUES (" . $mysqli->real_escape_string($group->gid) . ",\"" . $mysqli->real_escape_string($permission->pid) . "\",\"" . $mysqli->real_escape_string($value) . "\")";
  186.  
  187.     if ($mysqli->query($query)) return true; else return false;
  188.   }
  189.  
  190.   /**
  191.    * Sucht anhand einer Benutzer-ID einen Benutzer aus der Authentifizierungsdatenbank und gibt ihn zurück
  192.    *
  193.    * @param int $uid Benutzer-ID nach der gesucht werden soll
  194.    * @return null Wenn keine Benutzer gefunden wurde
  195.    * @return MSN_User Wenn ein Benutzer gefunden wurde der Benutzer, wenn nicht dann null
  196.    */
  197.   public function query_user(int $uid)
  198.   {
  199.     $this->require_connection();
  200.     $mysqli = $this->mysqli;
  201.  
  202.     $query = "SELECT * FROM auth_user WHERE uid = " . $mysqli->real_escape_string($uid);
  203.     $result = $mysqli->query($query);
  204.  
  205.     if ($row = $result->fetch_assoc()) return new MSN_User($row["uid"],$row["gid"],$row["name"],$row["password"],$row["exists_since"]); else return null;
  206.   }
  207.  
  208.   /**
  209.    * Sucht anhand eines Benutzernamens einen Benutzer aus der Authentifizierungsdatenbank und gibt ihn zurück
  210.    *
  211.    * @param string $name Benutzername nach dem gesucht werden soll
  212.    * @return null Wenn keine Benutzer gefunden wurde
  213.    * @return MSN_User Wenn ein Benutzer gefunden wurde
  214.    */
  215.   public function query_user_from_name(string $name)
  216.   {
  217.     $this->require_connection();
  218.     $mysqli = $this->mysqli;
  219.  
  220.     $query = "SELECT * FROM auth_user WHERE name = \"" . $mysqli->real_escape_string($name) . "\"";
  221.     $result = $mysqli->query($query);
  222.  
  223.     if ($row = $result->fetch_assoc()) return new MSN_User($row["uid"],$row["gid"],$row["name"],$row["password"],$row["exists_since"]); else return null;
  224.   }
  225.  
  226.   /**
  227.    * Sucht anhand einer Gruppen-ID eine Gruppe aus der Authentifizierungsdatenbank und gibt sie zurück
  228.    *
  229.    * @param int $gid Gruppen-ID nach der gesucht werden soll
  230.    * @return null Wenn keine Gruppe gefunden wurde
  231.    * @return MSN_Group Wenn eine Gruppe gefunden wurde
  232.    */
  233.   public function query_group(int $gid)
  234.   {
  235.     $this->require_connection();
  236.     $mysqli = $this->mysqli;
  237.  
  238.     $query = "SELECT * FROM auth_group WHERE gid = " . $mysqli->real_escape_string($gid);
  239.     $result = $mysqli->query($query);
  240.  
  241.     if ($row = $result->fetch_assoc()) return new MSN_Group($row["gid"],$row["name"],$row["exists_since"]); else return null;
  242.   }
  243.  
  244.   /**
  245.    * Sucht anhand eines Gruppennamens eine Gruppe aus der Authentifizierungsdatenbank und gibt sie zurück
  246.    *
  247.    * @param string $name Gruppenname nach dem gesucht werden soll
  248.    * @return null Wenn keine Gruppe gefunden wurde
  249.    * @return MSN_Group Wenn eine Gruppe gefunden wurde
  250.    */
  251.   public function query_group_from_name(string $name)
  252.   {
  253.     $this->require_connection();
  254.     $mysqli = $this->mysqli;
  255.  
  256.     $query = "SELECT * FROM auth_group WHERE name = \"" . $mysqli->real_escape_string($name). "\"";
  257.     $result = $mysqli->query($query);
  258.  
  259.     if ($row = $result->fetch_assoc()) return new MSN_Group($row["gid"],$row["name"],$row["exists_since"]); else return null;
  260.   }
  261.  
  262.   /**
  263.    * Sucht anhand einer Berechtigungs-ID eine Berechtigung aus der Authentifizierungsdatenbank und gibt sie zurück
  264.    *
  265.    * @param string $pid Berechtigungs-ID nach der gesucht werden soll
  266.    * @return null Wenn keine Berechtigung gefunden wurde
  267.    * @return MSN_Permission Wenn eine Berechtigung gefunden wurde
  268.    */
  269.   public function query_permission(string $pid)
  270.   {
  271.     $this->require_connection();
  272.     $mysqli = $this->mysqli;
  273.  
  274.     $query = "SELECT * FROM auth_permission WHERE pid = \"" . $mysqli->real_escape_string($pid) . "\"";
  275.     $result = $mysqli->query($query);
  276.  
  277.     if ($row = $result->fetch_assoc()) return new MSN_Permission($row["pid"],$row["default_value"]); else return null;
  278.   }
  279.  
  280.   /**
  281.    * Sucht anhand einer Gruppe und einer Berechtigung den zugeordneten Berechtigungswert und gibt diesen zurück
  282.    *
  283.    * @param MSN_Group $group Gruppe nach der gesucht werden soll
  284.    * @param MSN_Permission $permission Berechtigung nach der gesucht werden soll
  285.    * @return string Wenn ein Berechtigungswert gefunden wurde, der Berechtigungswert, sonst der Standardwert
  286.    */
  287.   public function query_group_permission(MSN_Group $group, MSN_Permission $permission)
  288.   {
  289.     $this->require_connection();
  290.     $mysqli = $this->mysqli;
  291.  
  292.     $query = "SELECT * FROM auth_permissions_group WHERE gid = " . $mysqli->real_escape_string($group->gid) . " AND pid = \"" . $mysqli->real_escape_string($permission->pid) . "\"";
  293.     $result = $mysqli->query($query);
  294.  
  295.     if ($row = $result->fetch_assoc()) return new MSN_GroupPermission($row["gid"],$row["pid"],$row["value"]); else return null;
  296.   }
  297.  
  298.   /**
  299.    * Überprüft, ob das gegeben Passwort dem des Benutzers entspricht.
  300.    *
  301.    * @param MSN_User $user Benutzer, dessen Passwort abgeglichen werden soll
  302.    * @param string $password Passwort, das mit dem des Benutzers abgeglichen werden soll
  303.    * @return bool Ist das Passwort korrekt?
  304.    */
  305.   public function authenticate_user(MSN_User $user, string $password)
  306.   {
  307.     return md5($password) == $user->password;
  308.   }
  309.  
  310.   /**
  311.    * Gibt den Berechtigungswert eines Benutzers aus, falls nicht vorhanden den Standardwert
  312.    *
  313.    * @param MSN_User $user Benutzer, dessen Berechtigung überprüft werden soll
  314.    * @param MSN_Permission $permission Berechtigung zum überprüfen
  315.    * @return string Berechtigungswert oder Standardwert
  316.    */
  317.   public function get_user_perm_value(MSN_User $user, MSN_Permission $permission)
  318.   {
  319.       $user_group = $this->query_group($user->gid);
  320.       $group_permission = $this->query_group_permission($user_group, $permission);
  321.  
  322.       if($group_permission != null) return $group_permission->value; else return $permission->default_value;
  323.   }
  324.  
  325.   /**
  326.    * Gibt den Berechtigungswert einer Gruppe aus, falls nicht vorhanden den Standardwert
  327.    *
  328.    * @param MSN_Group $group Gruppe, deren Berechtigung überprüft werden soll
  329.    * @param MSN_Permission $permission Berechtigung zum überprüfen
  330.    * @return string Berechtigungswert oder Standardwert
  331.    */
  332.   public function get_group_perm_value(MSN_Group $group, MSN_Group $permission)
  333.   {
  334.       $group_permission = $this->query_group_permission($group, $permission);
  335.  
  336.       if($group_permission != null) return $group_permission->$value; else return $permission->default_value;
  337.   }
  338. }
  339.  
  340. /**
  341.  * Spiegelt die Datenbankstruktur eines Benutzers wieder.
  342.  */
  343. class MSN_User
  344. {
  345.   /**
  346.    * @var int Benutzer-ID
  347.    */
  348.   public $uid;
  349.  
  350.   /**
  351.    * @var int Gruppen-ID
  352.    */
  353.   public $gid;
  354.  
  355.   /**
  356.    * @var string Eindeutiger Benutzername
  357.    */
  358.   public $name;
  359.  
  360.   /**
  361.    * @var string MD5-Hash des Benutzerpassworts
  362.    */
  363.   public $password;
  364.  
  365.   /**
  366.    * @var string Zeitstempel des Erstellungszeitpunktes
  367.    */
  368.   public $exists_since;
  369.  
  370.   /**
  371.    * Konstruktur für die MSN_User Klasse
  372.    *
  373.    * @param int $uid Benutzer-ID
  374.    * @param int $gid Gruppen-ID
  375.    * @param string $name Eindeutiger Benutzername
  376.    * @param string $password MD5-Hash des Benutzerpassworts
  377.    * @param string $exists_since Zeitstempel des Erstellungszeitpunktes
  378.    */
  379.   function __construct(int $uid, int $gid, string $name, string $password, string $exists_since)
  380.   {
  381.     $this->uid = $uid;
  382.     $this->gid = $gid;
  383.     $this->name = $name;
  384.     $this->password = $password;
  385.     $this->exists_since = $exists_since;
  386.   }
  387. }
  388.  
  389. /**
  390.  * Spiegelt die Datenbankstruktur einer Gruppe wieder.
  391.  */
  392. class MSN_Group
  393. {
  394.   /**
  395.    * @var int Gruppen-ID
  396.    */
  397.   public $gid;
  398.  
  399.   /**
  400.    * @var string Eindeutiger Gruppenname
  401.    */
  402.   public $name;
  403.  
  404.   /**
  405.    * @var string Zeitstempel des Erstellungszeitpunktes
  406.    */
  407.   public $exists_since;
  408.  
  409.   /**
  410.    * Konstruktur für die MSN_Group Klasse
  411.    *
  412.    * @param int $gid Gruppen-ID
  413.    * @param string $name Eindeutiger Gruppenname
  414.    * @param string $exists_since Zeitstempel des Erstellungszeitpunktes
  415.    */
  416.   function __construct(int $gid, string $name, string $exists_since)
  417.   {
  418.     $this->gid = $gid;
  419.     $this->name = $name;
  420.     $this->exists_since = $exists_since;
  421.   }
  422. }
  423.  
  424. /**
  425.  * Spiegelt die Datenbankstruktur einer Berechtigung wieder.
  426.  */
  427. class MSN_Permission
  428. {
  429.   /**
  430.    * @var string Berechtigungs-ID
  431.    */
  432.   public $pid;
  433.  
  434.   /**
  435.    * @var string Standardwert
  436.    */
  437.   public $default_value;
  438.  
  439.   /**
  440.    * Konstruktur für die MSN_Permission Klasse
  441.    *
  442.    * @param string $pid Berechtigungs-ID
  443.    * @param string $name Eindeutiger Berechtigungsname
  444.    * @param string $default_value Standardwert
  445.    */
  446.   function __construct(string $pid, string $default_value)
  447.   {
  448.     $this->pid = $pid;
  449.     $this->default_value = $default_value;
  450.   }
  451. }
  452.  
  453. /**
  454.  * Spiegelt die Datenbankstruktur einer Gruppenberechtigung wieder.
  455.  */
  456. class MSN_GroupPermission
  457. {
  458.   /**
  459.    * @var int Gruppen-ID
  460.    */
  461.   public $gid;
  462.  
  463.   /**
  464.    * @var string Berechtigungs-ID
  465.    */
  466.   public $pid;
  467.  
  468.   /**
  469.    * @var string Berechtigungswert
  470.    */
  471.   public $value;
  472.  
  473.   /**
  474.    * Konstruktur für die MSN_UserPermission Klasse
  475.    *
  476.    * @param int $gid Gruppen-ID
  477.    * @param string $pid Berechtigungs-ID
  478.    * @param string $value Berechtigungswert
  479.    */
  480.   function __construct(int $gid, string $pid, string $value)
  481.   {
  482.     $this->uid = $gid;
  483.     $this->pid = $pid;
  484.     $this->value = $value;
  485.   }
  486. }
  487. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement