Initial Commit
This commit is contained in:
156
app/Http/Controllers/AuthController.php
Normal file
156
app/Http/Controllers/AuthController.php
Normal 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);
|
||||
}
|
||||
}
|
||||
13
app/Http/Controllers/Controller.php
Normal file
13
app/Http/Controllers/Controller.php
Normal 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;
|
||||
}
|
||||
53
app/Http/Controllers/DomainController.php
Normal file
53
app/Http/Controllers/DomainController.php
Normal 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"]]));
|
||||
}
|
||||
}
|
||||
50
app/Http/Controllers/HomeController.php
Normal file
50
app/Http/Controllers/HomeController.php
Normal 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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
39
app/Http/Controllers/LanguageController.php
Normal file
39
app/Http/Controllers/LanguageController.php
Normal 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);
|
||||
}
|
||||
}
|
||||
224
app/Http/Controllers/RecordController.php
Normal file
224
app/Http/Controllers/RecordController.php
Normal 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));
|
||||
}
|
||||
}
|
||||
51
app/Http/Controllers/ReturnController.php
Normal file
51
app/Http/Controllers/ReturnController.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user