Initial Commit

This commit is contained in:
2021-05-13 11:20:17 +02:00
commit 48b3256ebf
126 changed files with 39162 additions and 0 deletions

View File

@@ -0,0 +1,156 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
public function getLogin()
{
return view('auth.login', [
'title' => 'Login',
]);
}
public function postLogin(Request $request)
{
$aData = $this->validate($request, [
'username' => 'required|exists:users,username',
'password' => 'required',
'remember' => '',
]);
$blRememberMe = false;
if (isset($aData["remember"])) {
$blRememberMe = true;
}
if (Auth::attempt([
'username' => $aData["username"],
'password' => $aData["password"]
], $blRememberMe)) {
return ReturnController::returnWithSuccess(__("messages.suc_login"), "/");
} else {
return ReturnController::returnWithError(__("messages.err_login"), "", true);
}
}
public function getChangePassword()
{
return view('auth.change-password', [
'title' => __("views.change_password")
]);
}
public function postChangePassword(Request $request)
{
$aData = $this->validate($request, [
'old_password' => 'required',
'new_password' => 'required'
]);
$aReturn = $this->changePassword(Auth::user()->username, $aData["old_password"], $aData["new_password"]);
if ($aReturn["status"] == "error") {
return ReturnController::returnWithError($aReturn["message"]);
} else {
return ReturnController::returnWithSuccess($aReturn["message"]);
}
}
public function changePassword(string $username, string $current_password, string $new_password): array
{
$oUser = User::where('username', $username)->first();
if (!Hash::check($current_password, $oUser->password)) {
return [
"status" => "error",
"message" => __("messages.old_password_incorrect"),
];
}
$oUser->password = Hash::make($new_password);
try {
$oUser->save();
} catch (\Exception $e) {
return [
"status" => "error",
"message" => __("messages.error_changing_password", ["error" => $e->getMessage()]),
];
}
return [
"status" => "ok",
"message" => __("messages.suc_changing_password"),
];
}
public function createUser(string $username, string $password): array
{
if (!User::where('username', $username)->get()->isEmpty()) {
return [
"status" => "error",
"message" => __("messages.err_user_existing"),
];
}
$oUser = new User();
$oUser->username = $username;
$oUser->password = Hash::make($password);
try {
$oUser->save();
} catch (\Exception $e) {
return [
"status" => "error",
"message" => __("messages.error_creating_user", ["error" => $e->getMessage()]),
];
}
return [
"status" => "ok",
"message" => __("messages.suc_creating_user", ["username" => $username]),
];
}
public function deleteUser(string $username)
{
$oUser = User::where('username', $username);
if ($oUser->get()->isEmpty()) {
return [
"status" => "error",
"message" => __("messages.error_no_user", ["username" => $username]),
];
}
try {
$oUser->delete();
} catch (\Exception $e) {
return [
"status" => "error",
"message" => __("messages.error_deleting_user", ["username" => $username, "error" => $e->getMessage()]),
];
}
return [
"status" => "ok",
"message" => __("messages.suc_deleting_user", ["username" => $username]),
];
}
public function getLogout()
{
Auth::logout();
return ReturnController::returnWithSuccess(__("messages.suc_logout"), "/", false);
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

View File

@@ -0,0 +1,53 @@
<?php
namespace App\Http\Controllers;
use App\Models\Domains;
use Illuminate\Http\Request;
class DomainController extends Controller
{
public function getManageDomains()
{
return view('domain_overview', [
'title' => __("views.domains"),
'domains' => Domains::orderBy('name', 'asc')->get(),
]);
}
public function postAddDomain(Request $request)
{
$aData = $this->validate($request, [
'name' => 'required|unique:domains,name'
]);
$oDomain = new Domains();
$oDomain->name = $aData["name"];
try {
$oDomain->save();
} catch (\Exception $e) {
return ReturnController::returnWithError(__("messages.error_saving_domain", ["error" => $e->getMessage()]));
}
return ReturnController::returnWithSuccess(__("messages.suc_saving_domain"));
}
public function postDeleteDomain(Request $request)
{
$aData = $this->validate($request, [
'domain_name' => 'required|exists:domains,name',
'domain_id' => 'required|exists:domains,id',
]);
try {
Domains::find($aData["domain_id"])->delete();
} catch (\Exception $e) {
return ReturnController::returnWithError(__("messages.error_deleting_domain", ["error" => $e->getMessage()]));
}
return ReturnController::returnWithSuccess(__("messages.suc_deleting_domain", ["domain" => $aData["domain_name"]]));
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Http\Controllers;
use App\Models\Domains;
use App\Models\Records;
class HomeController extends Controller
{
public function homeView()
{
$oRecords = Records::orderBy("name", "asc")->get();
$oDomains = Domains::orderBy("name", "asc")->get();
$aUpdated = [];
$aRecordCountByDomain = [];
foreach ($oRecords as $oRecord) {
if (empty($aRecordCountByDomain[$oRecord->domains_id])) {
$aRecordCountByDomain[$oRecord->domains_id] = 0;
}
$aRecordCountByDomain[$oRecord->domains_id]++;
$last_update = $oRecord->created_at;
$since_update = $last_update->diff(now());
if ($since_update->h != 0) {
$since_update_text = trans_choice("views.last_update_text_hours", $since_update->h, ["hours" => $since_update->h, "date" => $last_update]);
#$since_update_text = $since_update->h . " Stunde" . ($since_update->h > 1 ? "n ":" ") . $since_update->i . " Minuten";
} else {
$since_update_text = trans_choice("views.last_update_text_minutes", $since_update->i, ["minutes" => $since_update->i, "date" => $last_update]);
#$since_update_text = $since_update->i . " Minuten";
}
$aUpdated[$oRecord->domains_id] = [
'diff' => $since_update,
'text' => $since_update_text,
'timestamp' => $last_update,
];
}
return view('home', [
'title' => 'Home',
'records' => $oRecords,
'update' => $aUpdated,
'domains' => $oDomains,
'recordCount' => $aRecordCountByDomain,
]);
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\App;
class LanguageController extends Controller
{
public function setLanguage($sLangCode)
{
if ($this->validateLangCode($sLangCode)) {
session(["lang" => $sLangCode]);
return ReturnController::returnWithSuccess(__("messages.suc_lang_set"));
}
return ReturnController::returnWithError(__("messages.err_lang_code_not_found", ["code" => $sLangCode]));
}
public static function getActiveLanguage()
{
if (session()->has("lang")) {
return session()->get("lang");
}
return env("APP_LOCALE");
}
public function validateLangCode($sLangCode): bool
{
$codes = [
"ab", "aa", "af", "ak", "sq", "am", "ar", "an", "hy", "as", "av", "ae", "ay", "az", "bm", "ba", "eu", "be", "bn", "bh", "bi", "bs", "br", "bg", "my", "ca", "km", "ch", "ce", "ny", "zh", "cu", "cv", "kw", "co", "cr", "hr", "cs", "da", "dv", "nl", "dz", "en", "eo", "et", "ee", "fo", "fj", "fi", "fr", "ff", "gd", "gl", "lg", "ka", "de", "ki", "el", "kl", "gn", "gu", "ht", "ha", "he", "hz", "hi", "ho", "hu", "is", "io", "ig", "id", "ia", "ie", "iu", "ik", "ga", "it", "ja", "jv", "kn", "kr", "ks", "kk", "rw", "kv", "kg", "ko", "kj", "ku", "ky", "lo", "la", "lv", "lb", "li", "ln", "lt", "lu", "mk", "mg", "ms", "ml", "mt", "gv", "mi", "mr", "mh", "ro", "mn", "na", "nv", "nd", "ng", "ne", "se", "no", "nb", "nn", "ii", "oc", "oj", "or", "om", "os", "pi", "pa", "ps", "fa", "pl", "pt", "qu", "rm", "rn", "ru", "sm", "sg", "sa", "sc", "sr", "sn", "sd", "si", "sk", "sl", "so", "st", "nr", "es", "su", "sw", "ss", "sv", "tl", "ty", "tg", "ta", "tt", "te", "th", "bo", "ti", "to", "ts", "tn", "tr", "tk", "tw", "ug", "uk", "ur", "uz", "ve", "vi", "vo", "wa", "cy", "fy", "wo", "xh", "yi", "yo", "za", "zu",
];
return in_array($sLangCode, $codes);
}
}

View File

@@ -0,0 +1,224 @@
<?php
namespace App\Http\Controllers;
use App\Models\Domains;
use App\Models\Records;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
class RecordController extends Controller
{
public function fetchRecords($domain): \Illuminate\Support\Collection
{
$response = Http::withHeaders([
'X-Auth-Username' => env('SERVERCOW_API_USER'),
'X-Auth-Password' => env('SERVERCOW_API_PASS'),
'Content-Type' => 'application/json',
])->get(env('SERVERCOW_API_URL') . $domain);
return $response->collect();
}
public function getRecordJSON($iRecordId)
{
$oRecord = Records::find($iRecordId);
$oDomain = $oRecord->domain;
$oRecord = collect($oRecord);
$oRecord->put("domain", $oDomain->name);
return response()->json($oRecord);
}
public function getAddRecords()
{
return view('record_add', [
'title' => __("views.add_record"),
'domains' => Domains::orderBy('name', 'asc')->get(),
]);
}
public function postAddRecord(Request $request)
{
$aData = $this->validate($request, [
"type" => "required",
"name" => "",
"content" => "required",
"ttl" => "required|integer",
"domain" => "required|exists:domains,id",
]);
if ($aData["name"] === null) {
$aData["name"] = "";
}
/**
* Records with the types specified in the array can exist multiple times with the same name, therefore the content needs to be an array so that the existing records does not get lost
*/
$aRecords = [];
$blRecordArray = false;
if (in_array($aData["type"], ["mx", "txt", "caa", "tlsa"])) {
$blRecordArray = true;
$oRecords = Records::where([
['name', $aData["name"]],
['type', $aData["type"]],
['domains_id', $aData["domain"]],
])->get();
foreach ($oRecords as $oRecord) {
array_push($aRecords, $oRecord->content);
}
array_push($aRecords, $aData["content"]);
}
//--
if ($aData["type"] == "mx" && !$this->startsWithNumber($aData["content"])) {
$aData["content"] = "10 " . $aData["content"];
}
$sDomainName = Domains::find($aData["domain"])->name;
try {
$request = Http::withHeaders([
'X-Auth-Username' => env('SERVERCOW_API_USER'),
'X-Auth-Password' => env('SERVERCOW_API_PASS'),
'Content-Type' => 'application/json',
])->post(env('SERVERCOW_API_URL') . $sDomainName, [
"type" => $aData["type"],
"name" => $aData["name"],
"content" => $blRecordArray ? json_encode($aRecords) : $aData["content"],
"ttl" => $aData["ttl"]
]);
$aReturn = $request->json();
dd($aReturn);
if (array_key_exists("error", $aReturn)) {
return ReturnController::returnWithError(__("messages.error_saving_record", ["error" => $aReturn["error"]]));
}
} catch (\Exception $e) {
return ReturnController::returnWithError(__("messages.error_saving_record", ["error" => $e->getMessage()]));
}
$this->getNewRecordsForDomain($sDomainName, $aData["domain"]);
return ReturnController::returnWithSuccess(__("messages.suc_saving_record"));
}
public function postDeleteRecord(Request $request)
{
$aData = $this->validate($request, [
'type' => 'required',
'name' => '',
'domain_name' => 'required|exists:domains,name',
'domain_id' => 'required|integer|exists:domains,id'
]);
if ($aData["name"] === null) {
$aData["name"] = "";
}
try {
$request = Http::withHeaders([
'X-Auth-Username' => env('SERVERCOW_API_USER'),
'X-Auth-Password' => env('SERVERCOW_API_PASS'),
'Content-Type' => 'application/json',
])->delete(env('SERVERCOW_API_URL') . $aData["domain_name"], $aData);
$aReturn = $request->json();
if (array_key_exists("error", $aReturn)) {
return ReturnController::returnWithError(__("messages.error_deleting_record", ["error" => $aReturn["error"]]));
}
} catch (\Exception $e) {
return ReturnController::returnWithError(__("messages.error_deleting_record", ["error" => $e->getMessage()]));
}
$this->getNewRecordsForDomain($aData["domain_name"], $aData["domain_id"]);
return ReturnController::returnWithSuccess(__("messages.suc_deleting_record", ["record" => $aData["name"]]));
}
public function postEditRecord(Request $request)
{
$aData = $this->validate($request, [
'record_id' => 'required|exists:records,id',
'content' => 'required',
'ttl' => 'required|integer'
]);
$oRecord = Records::find($aData["record_id"]);
try {
$request = Http::withHeaders([
'X-Auth-Username' => env('SERVERCOW_API_USER'),
'X-Auth-Password' => env('SERVERCOW_API_PASS'),
'Content-Type' => 'application/json',
])->post(env('SERVERCOW_API_URL') . $oRecord->domain->name, [
"type" => $oRecord->type,
"name" => $oRecord->name,
"content" => $aData["content"],
"ttl" => $aData["ttl"]
]);
$aReturn = $request->json();
if (array_key_exists("error", $aReturn)) {
return ReturnController::returnWithError(__("messages.error_editing_record", ["error" => $aReturn["error"]]));
}
} catch (\Exception $e) {
return ReturnController::returnWithError(__("messages.error_editing_record", ["error" => $e->getMessage()]));
}
$this->getNewRecordsForDomain($oRecord->domain->name, $oRecord->domain->id);
return ReturnController::returnWithSuccess(__("messages.suc_editing_record"));
}
public function getNewRecords($sDomainName, $iDomainId)
{
try {
$this->getNewRecordsForDomain($sDomainName, $iDomainId);
} catch (\Exception $e) {
return ReturnController::returnWithError(__("messages.error_fetching_records", ["error" => $e->getMessage()]));
}
return ReturnController::returnWithSuccess(__("messages.suc_fetching_records", ["domain" => $sDomainName]));
}
public function getNewRecordsForDomain($sDomainName, $iDomainId)
{
try {
DB::table('records')->where('domains_id', $iDomainId)->delete();
} catch (\Exception $e) {
dd($e->getMessage());
}
$oAPIRecords = $this->fetchRecords($sDomainName);
foreach ($oAPIRecords as $oAPIRecord) {
$oRecord = new Records();
$oRecord->name = $oAPIRecord["name"];
$oRecord->ttl = $oAPIRecord["ttl"];
$oRecord->type = $oAPIRecord["type"];
$oRecord->content = $oAPIRecord["content"];
$oRecord->domains_id = $iDomainId;
try {
$oRecord->save();
} catch (\Exception $e) {
$this->error($e->getMessage());
}
}
}
public function startsWithNumber($string) {
return strlen($string) > 0 && ctype_digit(substr($string, 0, 1));
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Session;
class ReturnController extends Controller
{
public static function returnWithSuccess($message, $target = "", $to_route = false)
{
Session::flash('Success_Message', $message);
if (!empty($_POST["hash"])) {
return redirect("/" . $_POST["hash"]);
}
if ($target == "") {
return redirect()->back();
} else {
switch ($to_route) {
case false:
return redirect($target);
break;
case true:
return redirect()->route($target);
break;
}
}
}
public static function returnWithError($error, $target = "", $with_input = false)
{
Session::flash('Error_Message', $error);
if (!empty($_POST["hash"])) {
return redirect("/" . $_POST["hash"]);
}
if ($target == "") {
switch ($with_input) {
case false:
return redirect()->back();
break;
case true:
return redirect()->back()->withInput();
}
} else {
return redirect($target);
}
}
}