Compare commits
No commits in common. "6a41536d5761729d9a52f2363ee044d237752fe1" and "001618d719dd92e309cc81bd676f036ca16d9bd7" have entirely different histories.
6a41536d57
...
001618d719
@ -2,14 +2,13 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
namespace App\Http\Controllers\Auth;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Providers\RouteServiceProvider;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use App\Providers\RouteServiceProvider;
|
|
||||||
|
|
||||||
class LoginController extends Controller
|
class LoginController extends Controller
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -39,8 +38,7 @@ class LoginController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->middleware('guest')
|
$this->middleware('guest')->except('logout');
|
||||||
->except('logout');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function login(Request $request)
|
public function login(Request $request)
|
||||||
@ -72,7 +70,6 @@ class LoginController extends Controller
|
|||||||
if (file_exists('login_note.txt'))
|
if (file_exists('login_note.txt'))
|
||||||
$login_note = file_get_contents('login_note.txt');
|
$login_note = file_get_contents('login_note.txt');
|
||||||
|
|
||||||
return view('auth.login')
|
return view('auth.login')->with('login_note',$login_note);
|
||||||
->with('login_note',$login_note);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ class HomeController extends Controller
|
|||||||
})
|
})
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
return view('widgets.file')
|
return view('file')
|
||||||
->with('f',$f);
|
->with('f',$f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,11 +73,20 @@ class HomeController extends Controller
|
|||||||
->with(['echoarea'])
|
->with(['echoarea'])
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
return view('widgets.packet')
|
return view('packet')
|
||||||
->with('nm',$nm)
|
->with('nm',$nm)
|
||||||
->with('em',$em);
|
->with('em',$em);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render a view that summarises the users permissions
|
||||||
|
*/
|
||||||
|
public function permissions()
|
||||||
|
{
|
||||||
|
return view('auth.permissions')
|
||||||
|
->with('user',Auth::user());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show a packet dump
|
* Show a packet dump
|
||||||
*
|
*
|
||||||
|
@ -323,7 +323,7 @@ class SystemController extends Controller
|
|||||||
|
|
||||||
// Make sure that no other system has this address active.
|
// Make sure that no other system has this address active.
|
||||||
if ($o->role === Address::NODE_ACTIVE)
|
if ($o->role === Address::NODE_ACTIVE)
|
||||||
return redirect()->back()->withErrors(['address'=>sprintf('%s cannot be demoted any more',$o->ftn3D)]);
|
return redirect()->back()->withErrors(['demaddress'=>sprintf('%s cannot be demoted any more',$o->ftn3D)]);
|
||||||
|
|
||||||
$o->role = ($o->role << 1);
|
$o->role = ($o->role << 1);
|
||||||
$o->save();
|
$o->save();
|
||||||
@ -494,7 +494,7 @@ class SystemController extends Controller
|
|||||||
|
|
||||||
// Make sure that no other system has this address active.
|
// Make sure that no other system has this address active.
|
||||||
if ($o->role === Address::NODE_NC)
|
if ($o->role === Address::NODE_NC)
|
||||||
return redirect()->back()->withErrors(['address'=>sprintf('%s cannot be promoted any more',$o->ftn3D)]);
|
return redirect()->back()->withErrors(['proaddress'=>sprintf('%s cannot be promoted any more',$o->ftn3D)]);
|
||||||
|
|
||||||
$o->role = ($o->role >> 1);
|
$o->role = ($o->role >> 1);
|
||||||
$o->save();
|
$o->save();
|
||||||
@ -564,7 +564,7 @@ class SystemController extends Controller
|
|||||||
'active'=>TRUE,
|
'active'=>TRUE,
|
||||||
])->single())) {
|
])->single())) {
|
||||||
|
|
||||||
return redirect()->back()->withErrors(['address'=>sprintf('%s is already active on system [<a href="%s">%s</a>]',$o->ftn,url('system/addedit',$x->system_id),$x->system->name)]);
|
return redirect()->back()->withErrors(['susaddress'=>sprintf('%s is already active on system [<a href="%s">%s</a>]',$o->ftn,url('system/addedit',$x->system_id),$x->system->name)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$o->active = (! $o->active);
|
$o->active = (! $o->active);
|
||||||
|
@ -5,7 +5,6 @@ namespace App\Http\Controllers;
|
|||||||
use Illuminate\Auth\Events\Registered;
|
use Illuminate\Auth\Events\Registered;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Illuminate\Support\Facades\Hash;
|
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
|
||||||
use App\Http\Requests\UserRequest;
|
use App\Http\Requests\UserRequest;
|
||||||
@ -24,17 +23,13 @@ class UserController extends Controller
|
|||||||
|
|
||||||
if (! $o->exists)
|
if (! $o->exists)
|
||||||
$o->password = base64_encode(random_bytes(20));
|
$o->password = base64_encode(random_bytes(20));
|
||||||
elseif ($request->password)
|
|
||||||
$o->password = Hash::make($request->password);
|
|
||||||
|
|
||||||
$o->save();
|
$o->save();
|
||||||
|
|
||||||
if ($o->wasRecentlyCreated)
|
if ($o->wasRecentlyCreated)
|
||||||
event(new Registered($o));
|
event(new Registered($o));
|
||||||
|
|
||||||
return redirect()
|
return redirect()->to('user');
|
||||||
->to('user/addedit/'.$o->id)
|
|
||||||
->with('success','User Updated');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('user.addedit')
|
return view('user.addedit')
|
||||||
@ -70,4 +65,9 @@ class UserController extends Controller
|
|||||||
|
|
||||||
return view('user.link');
|
return view('user.link');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
return view('user/system/register');
|
||||||
|
}
|
||||||
}
|
}
|
@ -14,7 +14,7 @@ class AddressMerge extends FormRequest
|
|||||||
|
|
||||||
public function authorize()
|
public function authorize()
|
||||||
{
|
{
|
||||||
return Gate::allows('admin');
|
return Gate::allows( 'admin');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function rules(Request $request)
|
public function rules(Request $request)
|
||||||
|
@ -12,7 +12,7 @@ class AreafixRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
public function authorize()
|
public function authorize()
|
||||||
{
|
{
|
||||||
return Gate::allows('admin');
|
return Gate::allows( 'admin');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function rules(Request $request)
|
public function rules(Request $request)
|
||||||
|
@ -12,7 +12,7 @@ class DomainRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
public function authorize(Domain $o)
|
public function authorize(Domain $o)
|
||||||
{
|
{
|
||||||
return Gate::allows('admin',$o);
|
return Gate::allows( 'admin',$o);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function rules(Request $request)
|
public function rules(Request $request)
|
||||||
|
@ -10,7 +10,7 @@ class SetupRequest extends FormRequest
|
|||||||
{
|
{
|
||||||
public function authorize()
|
public function authorize()
|
||||||
{
|
{
|
||||||
return Gate::allows('admin');
|
return Gate::allows( 'admin');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function rules(Request $request)
|
public function rules(Request $request)
|
||||||
|
@ -7,11 +7,13 @@ use Illuminate\Http\Request;
|
|||||||
use Illuminate\Support\Facades\Gate;
|
use Illuminate\Support\Facades\Gate;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
|
||||||
class UserRequest extends FormRequest
|
class UserRequest extends FormRequest
|
||||||
{
|
{
|
||||||
public function authorize()
|
public function authorize()
|
||||||
{
|
{
|
||||||
return Gate::any(['admin','update'],$this->route('o'));
|
return Gate::allows( 'admin');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function rules(Request $request)
|
public function rules(Request $request)
|
||||||
|
@ -57,8 +57,7 @@ class User extends Authenticatable implements MustVerifyEmail
|
|||||||
*/
|
*/
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
'email_verified_at' => 'datetime',
|
'email_verified_at' => 'datetime',
|
||||||
'last_on' => 'datetime:Y-m-d H:i:s',
|
'last_on' => 'datetime:Y-m-d H:i:s'
|
||||||
'passkey' => 'json',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
/* RELATIONS */
|
/* RELATIONS */
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
"laravel/sanctum": "^3.2",
|
"laravel/sanctum": "^3.2",
|
||||||
"laravel/ui": "^4.0",
|
"laravel/ui": "^4.0",
|
||||||
"league/flysystem-aws-s3-v3": "^3.0",
|
"league/flysystem-aws-s3-v3": "^3.0",
|
||||||
"leenooks/passkey": "^0.1.0",
|
|
||||||
"nunomaduro/laravel-console-summary": "^1.9",
|
"nunomaduro/laravel-console-summary": "^1.9",
|
||||||
"rennokki/laravel-eloquent-query-cache": "^3.3",
|
"rennokki/laravel-eloquent-query-cache": "^3.3",
|
||||||
"repat/laravel-job-models": "^0.8",
|
"repat/laravel-job-models": "^0.8",
|
||||||
@ -48,10 +47,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"repositories": {
|
"repositories": {
|
||||||
"passkey": {
|
|
||||||
"type": "vcs",
|
|
||||||
"url": "https://gitea.dege.au/laravel/passkey.git"
|
|
||||||
},
|
|
||||||
"laravel-console-summary": {
|
"laravel-console-summary": {
|
||||||
"type": "vcs",
|
"type": "vcs",
|
||||||
"url": "https://github.com/leenooks/laravel-console-summary"
|
"url": "https://github.com/leenooks/laravel-console-summary"
|
||||||
|
88
composer.lock
generated
88
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "0f0e0e75d37ebcbcbc03996fb1f3e18b",
|
"content-hash": "b9697fb5a34c3ed05cea0ce107b63d3f",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "aglipanci/laravel-eloquent-case",
|
"name": "aglipanci/laravel-eloquent-case",
|
||||||
@ -1700,51 +1700,6 @@
|
|||||||
},
|
},
|
||||||
"time": "2023-05-09T19:47:28+00:00"
|
"time": "2023-05-09T19:47:28+00:00"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "lbuchs/webauthn",
|
|
||||||
"version": "v2.1.1",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/lbuchs/WebAuthn.git",
|
|
||||||
"reference": "e73ff007e8a1099e72e0dbdd9d0884057409fc54"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/lbuchs/WebAuthn/zipball/e73ff007e8a1099e72e0dbdd9d0884057409fc54",
|
|
||||||
"reference": "e73ff007e8a1099e72e0dbdd9d0884057409fc54",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=8.0.0"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"lbuchs\\WebAuthn\\": "src"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Lukas Buchs",
|
|
||||||
"role": "Developer"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "A simple PHP WebAuthn (FIDO2) server library",
|
|
||||||
"homepage": "https://github.com/lbuchs/webauthn",
|
|
||||||
"keywords": [
|
|
||||||
"Authentication",
|
|
||||||
"webauthn"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/lbuchs/WebAuthn/issues",
|
|
||||||
"source": "https://github.com/lbuchs/WebAuthn/tree/v2.1.1"
|
|
||||||
},
|
|
||||||
"time": "2024-01-15T15:46:57+00:00"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "league/commonmark",
|
"name": "league/commonmark",
|
||||||
"version": "2.4.1",
|
"version": "2.4.1",
|
||||||
@ -2205,47 +2160,6 @@
|
|||||||
],
|
],
|
||||||
"time": "2023-10-17T14:13:20+00:00"
|
"time": "2023-10-17T14:13:20+00:00"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "leenooks/passkey",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://gitea.dege.au/laravel/passkey.git",
|
|
||||||
"reference": "4872d55ed65863e03102eea1046504e630f80ae2"
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"lbuchs/webauthn": "^2.1"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"laravel": {
|
|
||||||
"providers": [
|
|
||||||
"Leenooks\\Passkey\\PasskeyServiceProvider"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Leenooks\\Passkey\\": "src"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Deon George",
|
|
||||||
"email": "deon@dege.au"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Leenooks Laravel Passkey Implementation",
|
|
||||||
"keywords": [
|
|
||||||
"dege",
|
|
||||||
"laravel",
|
|
||||||
"passkey"
|
|
||||||
],
|
|
||||||
"time": "2024-04-25T05:05:51+00:00"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "masterminds/html5",
|
"name": "masterminds/html5",
|
||||||
"version": "2.8.1",
|
"version": "2.8.1",
|
||||||
|
35
public/css/fixes.css
vendored
35
public/css/fixes.css
vendored
@ -99,38 +99,3 @@ ol {
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
background-color: inherit;
|
background-color: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* h1 headings reference */
|
|
||||||
h1>small.float-end {
|
|
||||||
padding-top: 2rem;
|
|
||||||
}
|
|
||||||
h1>small.float-end:before {
|
|
||||||
color: #acacac;
|
|
||||||
content: '[';
|
|
||||||
}
|
|
||||||
h1>small.float-end:after {
|
|
||||||
color: #acacac;
|
|
||||||
content: ']';
|
|
||||||
}
|
|
||||||
h1 sup {
|
|
||||||
text-shadow: none;
|
|
||||||
font-size: 50%;
|
|
||||||
top: -1em;
|
|
||||||
}
|
|
||||||
h1>small.success {
|
|
||||||
color: #005300 !important;
|
|
||||||
}
|
|
||||||
h1>small.success:before {
|
|
||||||
color: #00aa00;
|
|
||||||
content: '[';
|
|
||||||
}
|
|
||||||
h1>small.success:after {
|
|
||||||
color: #00aa00;
|
|
||||||
content: ']';
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ensure our greyframe titled boxes are full width */
|
|
||||||
.titledbox {
|
|
||||||
margin-right: 0;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
225
public/passkey/passkey.js
vendored
225
public/passkey/passkey.js
vendored
@ -1,225 +0,0 @@
|
|||||||
/*
|
|
||||||
* Passkey Implementation
|
|
||||||
*/
|
|
||||||
let passkey_debug = false;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a ArrayBuffer to Base64
|
|
||||||
* @param {ArrayBuffer} buffer
|
|
||||||
* @returns {String}
|
|
||||||
*/
|
|
||||||
function arrayBufferToBase64(buffer) {
|
|
||||||
let binary = '';
|
|
||||||
let bytes = new Uint8Array(buffer);
|
|
||||||
let len = bytes.byteLength;
|
|
||||||
for (let i = 0; i < len; i++) {
|
|
||||||
binary += String.fromCharCode( bytes[ i ] );
|
|
||||||
}
|
|
||||||
return window.btoa(binary);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* convert RFC 1342-like base64 strings to array buffer
|
|
||||||
* @param {mixed} obj
|
|
||||||
* @returns {undefined}
|
|
||||||
*/
|
|
||||||
function recursiveBase64StrToArrayBuffer(obj) {
|
|
||||||
let prefix = '=?BINARY?B?';
|
|
||||||
let suffix = '?=';
|
|
||||||
if (typeof obj === 'object') {
|
|
||||||
for (let key in obj) {
|
|
||||||
if (typeof obj[key] === 'string') {
|
|
||||||
let str = obj[key];
|
|
||||||
if (str.substring(0, prefix.length) === prefix && str.substring(str.length - suffix.length) === suffix) {
|
|
||||||
str = str.substring(prefix.length, str.length - suffix.length);
|
|
||||||
|
|
||||||
let binary_string = window.atob(str);
|
|
||||||
let len = binary_string.length;
|
|
||||||
let bytes = new Uint8Array(len);
|
|
||||||
for (let i = 0; i < len; i++) {
|
|
||||||
bytes[i] = binary_string.charCodeAt(i);
|
|
||||||
}
|
|
||||||
obj[key] = bytes.buffer;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
recursiveBase64StrToArrayBuffer(obj[key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function passkey_check_browser()
|
|
||||||
{
|
|
||||||
// check browser support
|
|
||||||
if ((! window.fetch) || (! navigator.credentials) || (! navigator.credentials.create))
|
|
||||||
throw new Error('Browser not supported.');
|
|
||||||
|
|
||||||
/*
|
|
||||||
// Availability of `window.PublicKeyCredential` means WebAuthn is usable.
|
|
||||||
// `isUserVerifyingPlatformAuthenticatorAvailable` means the feature detection is usable.
|
|
||||||
// `isConditionalMediationAvailable` means the feature detection is usable.
|
|
||||||
if (window.PublicKeyCredential &&
|
|
||||||
PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable &&
|
|
||||||
PublicKeyCredential.isConditionalMediationAvailable) {
|
|
||||||
// Check if user verifying platform authenticator is available.
|
|
||||||
Promise.all([
|
|
||||||
PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(),
|
|
||||||
PublicKeyCredential.isConditionalMediationAvailable(),
|
|
||||||
]).then(results => {
|
|
||||||
if (results.every(r => r === true)) {
|
|
||||||
// Display "Create a new passkey" button
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (passkey_debug)
|
|
||||||
console.log('Passkey: Browser OK');
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register/Create a passkey for a user
|
|
||||||
*/
|
|
||||||
async function passkey_register(csrf_token,icon_dom,icon,icon_shell_success,icon_shell_fail)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
if (! passkey_check_browser())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Change our icon so that it is obvious we are doing something
|
|
||||||
icon_dom.find('i').removeClass(icon).addClass('spinner-grow spinner-grow-sm');
|
|
||||||
|
|
||||||
// Get our arguments
|
|
||||||
var createArgs;
|
|
||||||
$.ajax({
|
|
||||||
url: '/passkey/register',
|
|
||||||
type: 'GET',
|
|
||||||
dataType: 'json',
|
|
||||||
async: false,
|
|
||||||
cache: false,
|
|
||||||
success: function(data) {
|
|
||||||
if (passkey_debug)
|
|
||||||
console.log('Passkey: Get Register Success');
|
|
||||||
|
|
||||||
recursiveBase64StrToArrayBuffer(data);
|
|
||||||
createArgs = data;
|
|
||||||
},
|
|
||||||
error: function(e,status,error) {
|
|
||||||
throw new Error(status || 'Unknown error occurred');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Create credentials
|
|
||||||
try {
|
|
||||||
const cred = await navigator.credentials.create(createArgs);
|
|
||||||
|
|
||||||
const authenticatorAttestationResponse = {
|
|
||||||
id: cred.id,
|
|
||||||
rawId: arrayBufferToBase64(cred.rawId),
|
|
||||||
transports: cred.response.getTransports ? cred.response.getTransports() : null,
|
|
||||||
clientDataJSON: cred.response.clientDataJSON ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
|
|
||||||
attestationObject: cred.response.attestationObject ? arrayBufferToBase64(cred.response.attestationObject) : null,
|
|
||||||
authenticatorAttachment: cred.authenticatorAttachment,
|
|
||||||
_token: csrf_token,
|
|
||||||
};
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: '/passkey/check',
|
|
||||||
type: 'POST',
|
|
||||||
data: authenticatorAttestationResponse,
|
|
||||||
cache: false,
|
|
||||||
success: function(data) {
|
|
||||||
if (passkey_debug)
|
|
||||||
console.log('Passkey: Registration Success');
|
|
||||||
|
|
||||||
icon_dom.find('i').addClass(icon).removeClass('spinner-grow spinner-grow-sm');
|
|
||||||
icon_dom.removeClass('btn-outline-primary').addClass('btn-primary');
|
|
||||||
},
|
|
||||||
error: function(e,status,error) {
|
|
||||||
throw new Error(status || 'Unknown error occurred');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
} catch (status) {
|
|
||||||
if (passkey_debug)
|
|
||||||
console.log(status || 'Passkey: User Aborted Register');
|
|
||||||
|
|
||||||
// Restore the icon
|
|
||||||
icon_dom.find('i').addClass(icon).removeClass('spinner-grow spinner-grow-sm');
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
window.alert(err || 'An UNKNOWN error occurred?');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check a passkey being presented
|
|
||||||
*/
|
|
||||||
async function passkey_check(csrf_token,redirect)
|
|
||||||
{
|
|
||||||
if (passkey_debug)
|
|
||||||
console.log('Passkey: Check User Passkey');
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (! passkey_check_browser())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Get our arguments
|
|
||||||
var getArgs;
|
|
||||||
$.ajax({
|
|
||||||
url: '/passkey/get',
|
|
||||||
type: 'GET',
|
|
||||||
dataType: 'json',
|
|
||||||
async: false,
|
|
||||||
cache: false,
|
|
||||||
success: function(data) {
|
|
||||||
if (passkey_debug)
|
|
||||||
console.log('Passkey: Get Args Success');
|
|
||||||
|
|
||||||
recursiveBase64StrToArrayBuffer(data);
|
|
||||||
getArgs = data;
|
|
||||||
},
|
|
||||||
error: function(e,status,error) {
|
|
||||||
throw new Error(status || 'Unknown error occurred');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// check credentials with hardware
|
|
||||||
const cred = await navigator.credentials.get(getArgs);
|
|
||||||
|
|
||||||
// create object for transmission to server
|
|
||||||
const authenticatorAttestationResponse = {
|
|
||||||
id: cred.rawId ? arrayBufferToBase64(cred.rawId) : null,
|
|
||||||
clientDataJSON: cred.response.clientDataJSON ? arrayBufferToBase64(cred.response.clientDataJSON) : null,
|
|
||||||
authenticatorData: cred.response.authenticatorData ? arrayBufferToBase64(cred.response.authenticatorData) : null,
|
|
||||||
signature: cred.response.signature ? arrayBufferToBase64(cred.response.signature) : null,
|
|
||||||
userHandle: cred.response.userHandle ? arrayBufferToBase64(cred.response.userHandle) : null,
|
|
||||||
_token: csrf_token
|
|
||||||
};
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: '/passkey/process',
|
|
||||||
type: 'POST',
|
|
||||||
data: authenticatorAttestationResponse,
|
|
||||||
cache: false,
|
|
||||||
success: function(data) {
|
|
||||||
if (passkey_debug)
|
|
||||||
console.log('Passkey: Process Success');
|
|
||||||
|
|
||||||
// Direct to the home page
|
|
||||||
window.location.href = (redirect !== undefined) ? redirect : '/';
|
|
||||||
},
|
|
||||||
error: function(e,status,error) {
|
|
||||||
throw new Error(status || 'Unknown error occurred');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
window.alert(err || 'An UNKNOWN error occurred?');
|
|
||||||
}
|
|
||||||
}
|
|
@ -5,7 +5,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
@if(isset($login_note) && $login_note)
|
@if(isset($login_note) AND $login_note)
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-8 m-auto">
|
<div class="col-8 m-auto">
|
||||||
<div class="alert alert-info alert-dismissible" role="alert">
|
<div class="alert alert-info alert-dismissible" role="alert">
|
||||||
@ -20,21 +20,20 @@
|
|||||||
</div>
|
</div>
|
||||||
@endisset
|
@endisset
|
||||||
|
|
||||||
<form class="needs-validation" method="post" novalidate>
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6 m-auto">
|
<div class="col-6 m-auto">
|
||||||
<div class="greyframe titledbox shadow0xb0 text-center">
|
<div class="greyframe titledbox shadow0xb0 text-center">
|
||||||
<h2 class="cap">Login</h2>
|
<h2 class="cap">Login</h2>
|
||||||
|
|
||||||
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="email" class="form-label">Email</label>
|
<label for="email" class="form-label">Email</label>
|
||||||
<div class="input-group has-validation">
|
<div class="input-group has-validation">
|
||||||
<span class="input-group-text"><i class="bi bi-person-badge"></i></span>
|
<span class="input-group-text"><i class="bi bi-person-badge"></i></span>
|
||||||
<!-- Conditionally display passkeys in autofill -->
|
<input type="text" class="form-control @error('email') is-invalid @enderror" id="email" placeholder="Email" name="email" required autocomplete="email" autofocus>
|
||||||
<input type="text" class="form-control @error('email') is-invalid @enderror" id="email" placeholder="Email" name="email" required autocomplete="email webauthn" autofocus>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
<span class="invalid-feedback" role="alert">
|
||||||
@error('email')
|
@error('email')
|
||||||
{{ $message }}
|
{{ $message }}
|
||||||
@ -51,7 +50,7 @@
|
|||||||
<label for="password" class="form-label">Password</label>
|
<label for="password" class="form-label">Password</label>
|
||||||
<div class="input-group has-validation">
|
<div class="input-group has-validation">
|
||||||
<span class="input-group-text"><i class="bi bi-key-fill"></i></span>
|
<span class="input-group-text"><i class="bi bi-key-fill"></i></span>
|
||||||
<input type="password" class="form-control" id="password" placeholder="Password" name="password" autocomplete="new-password" required>
|
<input type="password" class="form-control" id="password" placeholder="Password" name="password" required>
|
||||||
<span class="invalid-feedback" role="alert">
|
<span class="invalid-feedback" role="alert">
|
||||||
Your password is required.
|
Your password is required.
|
||||||
</span>
|
</span>
|
||||||
@ -71,6 +70,7 @@
|
|||||||
<button type="submit" name="submit" class="btn btn-success float-end">Sign In</button>
|
<button type="submit" name="submit" class="btn btn-success float-end">Sign In</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
@ -86,14 +86,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('page-scripts')
|
|
||||||
<!-- Passkeys -->
|
|
||||||
<script type='text/javascript' src='{{ asset('/passkey/passkey.js') }}'></script>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
passkey_check('{{ csrf_token() }}','{{ back()->getTargetUrl() }}');
|
|
||||||
</script>
|
|
||||||
@append
|
|
@ -5,16 +5,24 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
@includeWhen(session()->has('success'),'widgets.success-row',['msg'=>session()->get('success')])
|
@if (Session('status'))
|
||||||
|
<div class="row">
|
||||||
<form class="needs-validation" method="post" action="{{ route('password.email') }}" novalidate>
|
<div class="col-8 m-auto">
|
||||||
@csrf
|
<div class="alert alert-success" role="alert">
|
||||||
|
{{ session('status') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6 m-auto">
|
<div class="col-6 m-auto">
|
||||||
<div class="greyframe titledbox shadow0xb0 text-center">
|
<div class="greyframe titledbox shadow0xb0 text-center">
|
||||||
<h2 class="cap">Forgot Password</h2>
|
<h2 class="cap">Forgot Password</h2>
|
||||||
|
|
||||||
|
<form class="row g-0 needs-validation" method="post" action="{{ route('password.email') }}" novalidate>
|
||||||
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="email" class="form-label">Email</label>
|
<label for="email" class="form-label">Email</label>
|
||||||
@ -44,8 +52,8 @@
|
|||||||
<a class="link-danger" href="{{ url('login') }}">Login</a>
|
<a class="link-danger" href="{{ url('login') }}">Login</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
@ -5,16 +5,23 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
@includeWhen(session()->has('status') || true,'widgets.success-row',['msg'=>session()->get('status')])
|
@if (Session('status'))
|
||||||
|
<div class="row">
|
||||||
<form class="needs-validation" method="post" action="{{ route('password.update') }}" novalidate>
|
<div class="col-8 m-auto">
|
||||||
@csrf
|
<div class="alert alert-success" role="alert">
|
||||||
|
{{ session('status') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6 m-auto">
|
<div class="col-6 m-auto">
|
||||||
<div class="greyframe titledbox shadow0xb0 text-center">
|
<div class="greyframe titledbox shadow0xb0 text-center">
|
||||||
<h2 class="cap">Reset Password</h2>
|
<h2 class="cap">Reset Password</h2>
|
||||||
|
|
||||||
|
<form class="row g-0 needs-validation" method="post" action="{{ route('password.update') }}" novalidate>
|
||||||
|
@csrf
|
||||||
<input type="hidden" name="token" value="{{ $token }}">
|
<input type="hidden" name="token" value="{{ $token }}">
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@ -70,8 +77,8 @@
|
|||||||
<button type="submit" name="submit" class="btn btn-success float-end">Sign In</button>
|
<button type="submit" name="submit" class="btn btn-success float-end">Sign In</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
@ -4,8 +4,6 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
|
||||||
<div class="col-12">
|
|
||||||
<h2>{{ auth()->check() ? auth()->user()->name : 'Guest' }}</h2>
|
<h2>{{ auth()->check() ? auth()->user()->name : 'Guest' }}</h2>
|
||||||
|
|
||||||
<table class="table monotable">
|
<table class="table monotable">
|
||||||
@ -91,8 +89,6 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('page-css')
|
@section('page-css')
|
||||||
|
@ -5,14 +5,14 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6 m-auto">
|
<div class="col-6 m-auto">
|
||||||
<div class="greyframe titledbox shadow0xb0 text-center">
|
<div class="greyframe titledbox shadow0xb0 text-center">
|
||||||
<h2 class="cap">Register</h2>
|
<h2 class="cap">Register</h2>
|
||||||
|
|
||||||
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="name" class="form-label">Name</label>
|
<label for="name" class="form-label">Name</label>
|
||||||
@ -82,6 +82,7 @@
|
|||||||
<button type="submit" name="submit" class="btn btn-success float-end">Sign In</button>
|
<button type="submit" name="submit" class="btn btn-success float-end">Sign In</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
@ -91,5 +92,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
|
||||||
@endsection
|
@endsection
|
@ -5,14 +5,24 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" action="{{ route('verification.resend') }}" novalidate>
|
@if (Session('resent'))
|
||||||
@csrf
|
<div class="row">
|
||||||
|
<div class="col-8 m-auto">
|
||||||
|
<div class="alert alert-success alert-dismissible" role="alert">
|
||||||
|
{{ __('A fresh verification link has been sent to your email address.') }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6 m-auto">
|
<div class="col-6 m-auto">
|
||||||
<div class="greyframe titledbox shadow0xb0 text-center">
|
<div class="greyframe titledbox shadow0xb0 text-center">
|
||||||
<h2 class="cap">Verify</h2>
|
<h2 class="cap">Verify</h2>
|
||||||
|
|
||||||
|
<form class="row" method="post" action="{{ route('verification.resend') }}" novalidate>
|
||||||
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
{{ __('Before proceeding, please check your email for a verification link.') }}
|
{{ __('Before proceeding, please check your email for a verification link.') }}
|
||||||
@ -20,8 +30,8 @@
|
|||||||
<button type="submit" class="btn btn-link p-0" style="text-decoration: none;line-height: 1.0;">{{ __('click here to request another') }}</button>.
|
<button type="submit" class="btn btn-link p-0" style="text-decoration: none;line-height: 1.0;">{{ __('click here to request another') }}</button>.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -4,12 +4,14 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row pt-0">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2>List of known FTN Networks</h2>
|
<h2>List of known FTN Networks</h2>
|
||||||
|
|
||||||
<p>Here is a list of known <strong class="highlight">FTN Networks</strong>.</p>
|
<p>Here is a list of known <strong class="highlight">FTN Networks</strong>.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-12 pt-2">
|
||||||
<table class="table monotable" id="ftnlist">
|
<table class="table monotable" id="ftnlist">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -5,9 +5,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
<h1>{{ $o->name }} <small class="float-end pt-4">Last Update: {{ $o->updated_at->format('Y-m-d H:i') }}</small></h1>
|
||||||
<div class="col-12">
|
|
||||||
<h1>{{ $o->name }} <small class="float-end">Last Update: {{ $o->updated_at->format('Y-m-d H:i') }}</small></h1>
|
|
||||||
|
|
||||||
<div class="accordion" id="accordion_homepage">
|
<div class="accordion" id="accordion_homepage">
|
||||||
<!-- About -->
|
<!-- About -->
|
||||||
@ -25,7 +23,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Echomail -->
|
<!-- Echomail -->
|
||||||
<div class="accordion-item">
|
<div class="accordion-item open">
|
||||||
<h3 class="accordion-header">
|
<h3 class="accordion-header">
|
||||||
<span class="accordion-button collapsed" id="echoareas" data-bs-toggle="collapse" data-bs-target="#collapse_echoareas" aria-expanded="false" aria-controls="collapse_echoareas">Echo Areas</span>
|
<span class="accordion-button collapsed" id="echoareas" data-bs-toggle="collapse" data-bs-target="#collapse_echoareas" aria-expanded="false" aria-controls="collapse_echoareas">Echo Areas</span>
|
||||||
</h3>
|
</h3>
|
||||||
@ -175,8 +173,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('page-css')
|
@section('page-css')
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row pt-3">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h1>Echomail [{{ $o->msgid ?: '-' }}] <small class="float-end">#{{ $o->id }}</small></h1>
|
<h3>Echomail</h3>
|
||||||
|
|
||||||
@include('widgets.message',['msg'=>$o])
|
@include('widgets.message',['msg'=>$o])
|
||||||
</div>
|
</div>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<!-- Bootstrap & Jquery App -->
|
<!-- Bootstrap & Jquery App -->
|
||||||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous"></script>
|
||||||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="https:///cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous"></script>
|
||||||
|
|
||||||
<!-- JavaScript Bundle with Popper -->
|
<!-- JavaScript Bundle with Popper -->
|
||||||
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
|
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
<dl>
|
<dl>
|
||||||
<dt>Users</dt>
|
<dt>Users</dt>
|
||||||
<dd><a href="{{ url('user/addedit') }}">Create</a></dd>
|
<dd><a href="{{ url('user/addedit') }}">Create</a></dd>
|
||||||
<dd><a href="{{ url('user/list') }}">List</a></dd>
|
<dd><a href="{{ url('user') }}">List</a></dd>
|
||||||
</dl>
|
</dl>
|
||||||
@endcan
|
@endcan
|
||||||
@endauth
|
@endauth
|
||||||
|
@ -32,7 +32,6 @@
|
|||||||
</a>
|
</a>
|
||||||
<div class="collapse navbar-collapse" id="user-menu-list">
|
<div class="collapse navbar-collapse" id="user-menu-list">
|
||||||
<ul class="dropdown-menu dropdown-menu-dark">
|
<ul class="dropdown-menu dropdown-menu-dark">
|
||||||
<li><a class="dropdown-item" href="{{ url('user/addedit',$user->id) }}">Account Settings</a></li>
|
|
||||||
<li><a class="dropdown-item" href="{{ url('user/system/register') }}">Register/Link System</a></li>
|
<li><a class="dropdown-item" href="{{ url('user/system/register') }}">Register/Link System</a></li>
|
||||||
@can('admin')
|
@can('admin')
|
||||||
<li><a class="dropdown-item @if(preg_match('#^setup#',request()->path()))thispage @endif" href="{{ url('setup') }}">Setup</a></li>
|
<li><a class="dropdown-item @if(preg_match('#^setup#',request()->path()))thispage @endif" href="{{ url('setup') }}">Setup</a></li>
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row pt-3">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h1>Netmail [{{ $o->msgid ?: '-' }}] <small class="float-end">#{{ $o->id }}</small></h1>
|
<h3>Netmail</h3>
|
||||||
|
|
||||||
@include('widgets.message',['msg'=>$o])
|
@include('widgets.message',['msg'=>$o])
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" enctype="multipart/form-data" novalidate>
|
<form class="row g-0 needs-validation" method="post" enctype="multipart/form-data" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -10,16 +10,20 @@ use App\Classes\Protocol\{Binkp,EMSI,DNS};
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2>Site Setup</h2>
|
<h2>Site Setup</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row pt-0">
|
||||||
|
<div class="col-12">
|
||||||
<div class="greyframe titledbox shadow0xb0">
|
<div class="greyframe titledbox shadow0xb0">
|
||||||
<h2 class="cap">@if($o->exists) Update @else Initial @endif Setup</h2>
|
<h2 class="cap">@if($o->exists) Update @else Initial @endif Setup</h2>
|
||||||
|
|
||||||
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- System -->
|
<!-- System -->
|
||||||
<div class="col-4">
|
<div class="col-4">
|
||||||
@ -271,7 +275,7 @@ use App\Classes\Protocol\{Binkp,EMSI,DNS};
|
|||||||
|
|
||||||
<div class="row pt-5">
|
<div class="row pt-5">
|
||||||
<div class="col-2">
|
<div class="col-2">
|
||||||
<a href="{{ back()->getTargetUrl() }}" class="btn btn-danger">Cancel</a>
|
<a href="{{ url('domain') }}" class="btn btn-danger">Cancel</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="col-6 mt-auto mx-auto text-center align-bottom">
|
<span class="col-6 mt-auto mx-auto text-center align-bottom">
|
||||||
@ -294,10 +298,10 @@ use App\Classes\Protocol\{Binkp,EMSI,DNS};
|
|||||||
</div>
|
</div>
|
||||||
@endcan
|
@endcan
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('page-css')
|
@section('page-css')
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2>System Status</h2>
|
<h2>System Status</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="accordion" id="accordion_status">
|
<div class="accordion" id="accordion_status">
|
||||||
<!-- Totals -->
|
<!-- Totals -->
|
||||||
@ -198,8 +200,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('page-css')
|
@section('page-css')
|
||||||
|
@ -7,10 +7,8 @@
|
|||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
@if($o->exists)
|
@if($o->exists)
|
||||||
<h1>
|
<h1>{{ $o->name }}@if($o->setup)<sup class="success" style="text-shadow: 0 0; font-size: 50%; top: -1em;">*</sup>@endif</h1>
|
||||||
{{ $o->name }}@if($o->setup)<sup class="success">*</sup>@endif
|
@if($o->setup)<sup class="success" style="float:right;top:-2em;">* This Host</sup>@endif
|
||||||
@if($o->setup)<small class="success float-end">* This Host</small>@endif
|
|
||||||
</h1>
|
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if($o->zcs->count())
|
@if($o->zcs->count())
|
||||||
@ -27,7 +25,7 @@
|
|||||||
|
|
||||||
<div id="collapse_system" class="accordion-collapse collapse {{ (! $flash=session()->pull('accordion')) ? 'show' : '' }}" aria-labelledby="system" data-bs-parent="#accordion_homepage">
|
<div id="collapse_system" class="accordion-collapse collapse {{ (! $flash=session()->pull('accordion')) ? 'show' : '' }}" aria-labelledby="system" data-bs-parent="#accordion_homepage">
|
||||||
<div class="accordion-body">
|
<div class="accordion-body">
|
||||||
@include('system.widget.form-system')
|
@include('system.form-system')
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -40,8 +38,6 @@
|
|||||||
|
|
||||||
<div id="collapse_addresses" class="accordion-collapse collapse {{ ($flash=='address') ? 'show' : '' }}" aria-labelledby="addresses" data-bs-parent="#accordion_homepage">
|
<div id="collapse_addresses" class="accordion-collapse collapse {{ ($flash=='address') ? 'show' : '' }}" aria-labelledby="addresses" data-bs-parent="#accordion_homepage">
|
||||||
<div class="accordion-body">
|
<div class="accordion-body">
|
||||||
<div class="row">
|
|
||||||
<div class="col-12">
|
|
||||||
<p>FidoNet addresses are constructed in the format <strong class="highlight">zone</strong>:<strong class="highlight">net</strong>/<strong class="highlight">node</strong>.<strong class="highlight">point</strong><span>@</span><strong class="highlight">domain</strong>.</p>
|
<p>FidoNet addresses are constructed in the format <strong class="highlight">zone</strong>:<strong class="highlight">net</strong>/<strong class="highlight">node</strong>.<strong class="highlight">point</strong><span>@</span><strong class="highlight">domain</strong>.</p>
|
||||||
|
|
||||||
<div class="accordion accordion-flush" id="accordion_ftnaddress">
|
<div class="accordion accordion-flush" id="accordion_ftnaddress">
|
||||||
@ -118,7 +114,7 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
@foreach ($o->addresses->sortBy(function($item) { return sprintf('%04x%04x%04x%04x%04x',$item->zone->zone_id,$item->region_id,$item->host_id,$item->node_id,$item->point_id); }) as $oo)
|
@foreach ($o->addresses->sortBy(function($item) { return sprintf('%04x%04x%04x%04x%04x',$item->zone->zone_id,$item->region_id,$item->host_id,$item->node_id,$item->point_id); }) as $oo)
|
||||||
<tr>
|
<tr>
|
||||||
<td @if($oo->trashed()) class="trashed" @elseif (! $oo->active) class="inactive" @endif>{{ $oo->ftn }}<span class="float-end"><i title="@if($oo->validated)Mail flowing @else Mail held @endif" class="bi @if($oo->validated)bi-activity @else bi-radioactive @endif"></i></span></td>
|
<td @if($oo->trashed()) class="trashed" @elseif (! $oo->active) class="inactive" @endif>{{ $oo->ftn }} <span class="float-end"><i title="@if($oo->validated)Mail flowing @else Mail held @endif" class="bi @if($oo->validated)bi-activity @else bi-radioactive @endif"></i></span></td>
|
||||||
<td>{{ $oo->active ? 'YES' : 'NO' }}</td>
|
<td>{{ $oo->active ? 'YES' : 'NO' }}</td>
|
||||||
<td class="text-end">{{ $oo->security }}</td>
|
<td class="text-end">{{ $oo->security }}</td>
|
||||||
<td>{{ $oo->role_name }}</td>
|
<td>{{ $oo->role_name }}</td>
|
||||||
@ -148,27 +144,28 @@
|
|||||||
@endforeach
|
@endforeach
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@endif
|
|
||||||
|
|
||||||
</div>
|
@error('susaddress')
|
||||||
</div>
|
|
||||||
|
|
||||||
@error('address')
|
|
||||||
<div class="row pb-5">
|
|
||||||
<div class="col-12">
|
|
||||||
<span class="btn btn-sm btn-danger" role="alert" style="text-align: left;">
|
<span class="btn btn-sm btn-danger" role="alert" style="text-align: left;">
|
||||||
{!! $message !!}
|
{!! $message !!}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@enderror
|
@enderror
|
||||||
|
|
||||||
|
@error('demaddress')
|
||||||
|
<span class="btn btn-sm btn-danger" role="alert" style="text-align: left;">
|
||||||
|
{!! $message !!}
|
||||||
|
</span>
|
||||||
|
@enderror
|
||||||
|
|
||||||
|
@error('proaddress')
|
||||||
|
<span class="btn btn-sm btn-danger" role="alert" style="text-align: left;">
|
||||||
|
{!! $message !!}
|
||||||
|
</span>
|
||||||
|
@enderror
|
||||||
|
@endif
|
||||||
|
|
||||||
@can('admin',$o)
|
@can('admin',$o)
|
||||||
<div class="row pb-2">
|
@include('system.form-address')
|
||||||
<div class="col-12">
|
|
||||||
@include('system.widget.form-address')
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@else
|
@else
|
||||||
You'll need to ask an admin to assign addresses.
|
You'll need to ask an admin to assign addresses.
|
||||||
@ -235,7 +232,7 @@
|
|||||||
<p>No session details exist</p>
|
<p>No session details exist</p>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@include('system.widget.form-session')
|
@include('system.form-session')
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -249,7 +246,7 @@
|
|||||||
<div id="collapse_echoarea" class="accordion-collapse collapse {{ ($flash=='echoarea') ? 'show' : '' }}" aria-labelledby="echoarea" data-bs-parent="#accordion_homepage">
|
<div id="collapse_echoarea" class="accordion-collapse collapse {{ ($flash=='echoarea') ? 'show' : '' }}" aria-labelledby="echoarea" data-bs-parent="#accordion_homepage">
|
||||||
<div class="accordion-body">
|
<div class="accordion-body">
|
||||||
<p>This system can subscribe to the following echoareas:</p>
|
<p>This system can subscribe to the following echoareas:</p>
|
||||||
@include('system.widget.form-echoarea')
|
@include('system.form-echoarea')
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -263,7 +260,7 @@
|
|||||||
<div id="collapse_filearea" class="accordion-collapse collapse {{ ($flash=='filearea') ? 'show' : '' }}" aria-labelledby="filearea" data-bs-parent="#accordion_homepage">
|
<div id="collapse_filearea" class="accordion-collapse collapse {{ ($flash=='filearea') ? 'show' : '' }}" aria-labelledby="filearea" data-bs-parent="#accordion_homepage">
|
||||||
<div class="accordion-body">
|
<div class="accordion-body">
|
||||||
<p>This system can subscribe to the following fileareas:</p>
|
<p>This system can subscribe to the following fileareas:</p>
|
||||||
@include('system.widget.form-filearea')
|
@include('system.form-filearea')
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -641,9 +638,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@else
|
@else
|
||||||
@include('system.widget.form-system')
|
@include('system.form-system')
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -661,18 +657,18 @@
|
|||||||
@endsection
|
@endsection
|
||||||
@section('page-scripts')
|
@section('page-scripts')
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function () {
|
$(document).ready(function() {
|
||||||
$('.default').click(function () {
|
$('.default').click(function() {
|
||||||
var item = this;
|
var item = this;
|
||||||
icon = $(item).find('i');
|
icon = $(item).find('i');
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
data: {sid: {{$o->id}}, _token: '{{csrf_token()}}', set: (icon.hasClass('bi-square') ? 1 : 0)},
|
data: {sid: {{$o->id}},_token: '{{csrf_token()}}',set:(icon.hasClass('bi-square') ? 1 : 0)},
|
||||||
beforeSend: function () {
|
beforeSend: function() {
|
||||||
$(item).find('i').addClass('spinner-grow spinner-grow-sm');
|
$(item).find('i').addClass('spinner-grow spinner-grow-sm');
|
||||||
},
|
},
|
||||||
success: function () {
|
success: function() {
|
||||||
if (icon.hasClass('bi-square')) {
|
if (icon.hasClass('bi-square')) {
|
||||||
icon.removeClass('bi-square');
|
icon.removeClass('bi-square');
|
||||||
icon.addClass('bi-check-square');
|
icon.addClass('bi-check-square');
|
||||||
@ -683,13 +679,13 @@
|
|||||||
|
|
||||||
$(item).find('i').removeClass('spinner-grow spinner-grow-sm');
|
$(item).find('i').removeClass('spinner-grow spinner-grow-sm');
|
||||||
},
|
},
|
||||||
error: function (e) {
|
error: function(e) {
|
||||||
$(item).find('i').removeClass('spinner-grow spinner-grow-sm');
|
$(item).find('i').removeClass('spinner-grow spinner-grow-sm');
|
||||||
|
|
||||||
if (e.status != 412)
|
if (e.status != 412)
|
||||||
alert('That didnt work? Please try again....');
|
alert('That didnt work? Please try again....');
|
||||||
},
|
},
|
||||||
url: '{{ url('zone/api/default') }}/' + item.attributes.itemid.nodeValue,
|
url: '{{ url('zone/api/default') }}/'+item.attributes.itemid.nodeValue,
|
||||||
cache: false
|
cache: false
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
@ -6,16 +6,16 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
<div class="row pt-0">
|
||||||
@csrf
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2>Merge Address {{ $o->ftn }}</h2>
|
<h2>Merge Address {{ $o->ftn }}</h2>
|
||||||
<p>{{ $o->system->sysop }} : {{ $o->system->name }}</p>
|
<p>{{ $o->system->sysop }} : {{ $o->system->name }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
|
<form method="POST">
|
||||||
|
@csrf
|
||||||
|
|
||||||
<table class="table monotable">
|
<table class="table monotable">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -63,9 +63,9 @@
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
<button type="submit" name="submit" class="btn btn-success float-end">Merge</button>
|
<button type="submit" name="submit" class="btn btn-success float-end">Merge</button>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
@include('widgets.error')
|
@include('error')
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
@ -11,9 +11,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@includeWhen(session()->has('success'),'widgets.success',['msg'=>session()->get('success')])
|
@include('widgets.success')
|
||||||
|
|
||||||
<form class="needs-validation" method="post" novalidate>
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row pt-0">
|
<div class="row pt-0">
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
<form class="needs-validation" method="post" action="{{ url('system/address/add',$o->id) }}" novalidate>
|
<form class="row g-0 needs-validation" method="post" action="{{ url('system/address/add',$o->id) }}" novalidate>
|
||||||
@csrf
|
|
||||||
<input type="hidden" id="action" name="action" value="">
|
<input type="hidden" id="action" name="action" value="">
|
||||||
|
@csrf
|
||||||
|
|
||||||
|
<div class="row pt-0">
|
||||||
|
<div class="col-12">
|
||||||
<div class="greyframe titledbox shadow0xb0">
|
<div class="greyframe titledbox shadow0xb0">
|
||||||
<h2 class="cap">Assign New/Update Existing Address</h2>
|
<h2 class="cap">Assign New/Update Existing Address</h2>
|
||||||
|
|
||||||
@ -190,7 +192,8 @@
|
|||||||
@endcan
|
@endcan
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
@section('page-scripts')
|
@section('page-scripts')
|
@ -3,7 +3,7 @@
|
|||||||
->orderBy('zone_id')
|
->orderBy('zone_id')
|
||||||
->get())->count())
|
->get())->count())
|
||||||
|
|
||||||
<form class="needs-validation" method="post" action="{{ url('system/echoarea',$o->id) }}" novalidate>
|
<form class="row g-0 needs-validation" method="post" action="{{ url('system/echoarea',$o->id) }}" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row pt-0">
|
<div class="row pt-0">
|
@ -3,7 +3,7 @@
|
|||||||
->orderBy('zone_id')
|
->orderBy('zone_id')
|
||||||
->get())->count())
|
->get())->count())
|
||||||
|
|
||||||
<form class="needs-validation" method="post" action="{{ url('system/filearea',$o->id) }}" novalidate>
|
<form class="row g-0 needs-validation" method="post" action="{{ url('system/filearea',$o->id) }}" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row pt-0">
|
<div class="row pt-0">
|
@ -4,7 +4,9 @@
|
|||||||
->whereNotIn('id',$o->sessions->pluck('id'))
|
->whereNotIn('id',$o->sessions->pluck('id'))
|
||||||
->get())->count())
|
->get())->count())
|
||||||
|
|
||||||
<form class="needs-validation" method="post" action="{{ url('system/session/add',$o->id) }}" novalidate>
|
<hr>
|
||||||
|
|
||||||
|
<form class="row g-0 needs-validation" method="post" action="{{ url('system/session/add',$o->id) }}" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row pt-0">
|
<div class="row pt-0">
|
14
resources/views/system/form-system.blade.php
Normal file
14
resources/views/system/form-system.blade.php
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
|
@csrf
|
||||||
|
<input type="hidden" name="system_id" value="{{ $o->id }}">
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="greyframe titledbox shadow0xb0">
|
||||||
|
<h2 class="cap">@can('update',$o) @if($o->exists) Update @else Add @endif @endif System</h2>
|
||||||
|
|
||||||
|
@include('system.widget.form-system')
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
@ -6,7 +6,7 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2>About BBS Systems</h2>
|
<h2>BBS Systems</h2>
|
||||||
<p>BBS Systems Send and Receive Echomail and Files.</p>
|
<p>BBS Systems Send and Receive Echomail and Files.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="row">
|
<div class="row pt-0">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2>List of Connectable Systems</h2>
|
<h2>List of Connectable Systems</h2>
|
||||||
|
|
||||||
|
@ -5,20 +5,22 @@ Move Address
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h1>
|
<h1>{{ $o->system->name }} - {{ $o->ftn }}@if($o->system->setup)<sup class="success" style="text-shadow: 0 0; font-size: 50%; top: -1em;">*</sup>@endif</h1>
|
||||||
{{ $o->system->name }} - {{ $o->ftn }}@if($o->system->setup)<sup class="success">*</sup>@endif
|
@if($o->system->setup)<sup class="success" style="float:right;top:-2em;">* This Host</sup>@endif
|
||||||
@if($o->system->setup)<small class="success float-end">* This Host</small>@endif
|
</div>
|
||||||
</h1>
|
</div>
|
||||||
|
|
||||||
|
<div class="row pt-0">
|
||||||
|
<div class="col-12">
|
||||||
<!-- @todo The list of presented system should only be those that the user can see -->
|
<!-- @todo The list of presented system should only be those that the user can see -->
|
||||||
<div class="greyframe titledbox shadow0xb0">
|
<div class="greyframe titledbox shadow0xb0">
|
||||||
<h2 class="cap">Move Address</h2>
|
<h2 class="cap">Move Address</h2>
|
||||||
|
|
||||||
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- Choose System -->
|
<!-- Choose System -->
|
||||||
<div class="col-4">
|
<div class="col-4">
|
||||||
@ -103,10 +105,10 @@ Move Address
|
|||||||
</div>
|
</div>
|
||||||
@endcan
|
@endcan
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('page-css')
|
@section('page-css')
|
||||||
|
@ -1,14 +1,452 @@
|
|||||||
<form class="needs-validation" method="post" novalidate>
|
<!-- $o = System::class -->
|
||||||
@csrf
|
<div class="row pt-0">
|
||||||
<input type="hidden" name="system_id" value="{{ $o->id }}">
|
<div class="col-12">
|
||||||
|
<h4 class="mb-0 pb-2">System Users</h4>
|
||||||
|
|
||||||
<div class="row pt-0">
|
<div class="row pt-0">
|
||||||
<div class="col-12">
|
<!-- Users -->
|
||||||
<div class="greyframe titledbox shadow0xb0">
|
<div class="col-4">
|
||||||
<h2 class="cap">@can('update',$o) @if($o->exists) Update @else Add @endif @endif System</h2>
|
<label for="users" class="form-label">Owners</label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<span class="input-group-text"><i class="bi bi-people-fill"></i></span>
|
||||||
|
<select style="width: 80%;" class="form-select @error('users') is-invalid @enderror" id="users" name="users[]">
|
||||||
|
<option value=""> </option>
|
||||||
|
@foreach (\App\Models\User::orderBy('name')->active()->get() as $uo)
|
||||||
|
<option value="{{ $uo->id }}" @if(in_array($uo->id,old('users',$o->users->pluck('id')->toArray())))selected @endif>{{ $uo->name }} <small>({{ $uo->email }})</small></option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
|
||||||
@include('system.widget.system')
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('users')
|
||||||
|
{{ $message }}
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<h4 class="mb-0 pb-2">System Details</h4>
|
||||||
|
|
||||||
|
<div class="row pt-0">
|
||||||
|
<!-- Name -->
|
||||||
|
<div class="col-4">
|
||||||
|
<label for="name" class="form-label">BBS Name</label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<span class="input-group-text"><i class="bi bi-pc"></i></span>
|
||||||
|
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" placeholder="Name" name="name" value="{{ old('name',$o->name) }}" required @cannot('update',$o)readonly @endcannot autofocus>
|
||||||
|
<span id="search-icon" style="width: 0;"><i style="border-radius: 50%;" class="spinner-border spinner-border-sm text-dark d-none"></i></span>
|
||||||
|
<div id="system_search_results"></div>
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('name')
|
||||||
|
{{ $message }}
|
||||||
|
@else
|
||||||
|
A name is required.
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ZeroTier ID -->
|
||||||
|
<div class="col-3">
|
||||||
|
<label for="zt_id" class="form-label">ZeroTier ID</label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<span class="input-group-text"><i class="bi bi-shield-lock-fill"></i></span>
|
||||||
|
<input type="text" class="form-control @error('zt_id') is-invalid @enderror" id="zt_id" placeholder="ZeroTier" name="zt_id" value="{{ old('zt_id',$o->zt_id) }}" @cannot($action,$o)readonly @endcannot>
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('zt_id')
|
||||||
|
{{ $message }}
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Active -->
|
||||||
|
<div class="offset-2 col-2">
|
||||||
|
@can('update',$o)
|
||||||
|
<label for="active" class="form-label">Active</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
<input type="radio" class="btn-check" name="active" id="active_yes" value="1" required @if(old('active',$o->active))checked @endif>
|
||||||
|
<label class="btn btn-outline-success" for="active_yes">Yes</label>
|
||||||
|
|
||||||
|
<input type="radio" class="btn-check btn-danger" name="active" id="active_no" value="0" required @if(! old('active',$o->active))checked @endif>
|
||||||
|
<label class="btn btn-outline-danger" for="active_no">No</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endcan
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<!-- Sysop -->
|
||||||
|
<div class="col-4">
|
||||||
|
<label for="sysop" class="form-label">Sysop</label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<span class="input-group-text"><i class="bi bi-person-fill"></i></span>
|
||||||
|
<input type="text" class="form-control @error('sysop') is-invalid @enderror" id="sysop" placeholder="Sysop" name="sysop" value="{{ old('sysop',$o->sysop) }}" required @cannot('admin',$o)readonly @endcannot autocomplete="name">
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('sysop')
|
||||||
|
{{ $message }}
|
||||||
|
@else
|
||||||
|
A Sysop's name is required.
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Location -->
|
||||||
|
<div class="col-4">
|
||||||
|
<label for="location" class="form-label">Location</label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<span class="input-group-text"><i class="bi bi-globe"></i></span>
|
||||||
|
<input type="text" class="form-control @error('location') is-invalid @enderror" id="location" placeholder="Location" name="location" value="{{ old('location',$o->location) }}" required @cannot($action,$o)readonly @endcannot>
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('location')
|
||||||
|
{{ $message }}
|
||||||
|
@else
|
||||||
|
System location is required.
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Hold -->
|
||||||
|
<div class="offset-1 col-2">
|
||||||
|
@can('update',$o)
|
||||||
|
<label for="hold" class="form-label">Hold Mail <i class="bi bi-info-circle" title="Dont give the node any mail regardless of poll mode"></i></label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
<input type="radio" class="btn-check" name="hold" id="hold_yes" value="1" required @if(old('hold',$o->hold))checked @endif>
|
||||||
|
<label class="btn btn-outline-warning" for="hold_yes">Yes</label>
|
||||||
|
|
||||||
|
<input type="radio" class="btn-check btn-danger" name="hold" id="hold_no" value="0" required @if(! old('hold',$o->hold))checked @endif>
|
||||||
|
<label class="btn btn-outline-success" for="hold_no">No</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endcan
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<!-- Address -->
|
||||||
|
<div class="col-5">
|
||||||
|
<label for="address" class="form-label">BBS Internet Hostname</label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<span class="input-group-text"><i class="bi bi-globe"></i></span>
|
||||||
|
<input type="text" class="w-75 form-control @error('address') is-invalid @enderror" id="address" placeholder="FQDN" name="address" value="{{ old('address',$o->address) }}" @cannot($action,$o)readonly @endcannot>
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('address')
|
||||||
|
{{ $message }}
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Phone -->
|
||||||
|
<div class="col-3">
|
||||||
|
<label for="phone" class="form-label">Phone</label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<span class="input-group-text"><i class="bi bi-telephone-fill"></i></span>
|
||||||
|
<input type="text" class="form-control @error('phone') is-invalid @enderror" id="phone" placeholder="Phone" name="phone" value="{{ old('phone',$o->phone) }}" @cannot($action,$o)readonly @endcannot>
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('phone')
|
||||||
|
{{ $message }}
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Poll Mode -->
|
||||||
|
<div class="offset-1 col-3">
|
||||||
|
@can('update',$o)
|
||||||
|
<label for="pollmode" class="form-label">Poll Mode <i class="bi bi-info-circle" title="Poll node when mail available, poll on a schedule or hold mail for collection"></i></label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<div class="btn-group @error('pollmode') is-invalid @enderror" role="group">
|
||||||
|
<input type="radio" class="btn-check" name="pollmode" id="poll_crash" value="2" @if((int)old('pollmode',($o->pollmode === TRUE) ? 2 : 0) === 2)checked @endif>
|
||||||
|
<label class="btn btn-outline-success" for="poll_crash">Crash</label>
|
||||||
|
|
||||||
|
<input type="radio" class="btn-check btn-danger" name="pollmode" id="poll_normal" value="1" @if((int)old('pollmode',($o->pollmode === FALSE) ? 1 : 0) === 1)checked @endif>
|
||||||
|
<label class="btn btn-outline-secondary" for="poll_normal">Normal</label>
|
||||||
|
|
||||||
|
<input type="radio" class="btn-check btn-danger" name="pollmode" id="poll_hold" value="0" @if((int)old('pollmode',is_null($o->pollmode) ? 0 : 1) === 0)checked @endif>
|
||||||
|
<label class="btn btn-outline-warning" for="poll_hold">Hold</label>
|
||||||
|
</div>
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('pollmode')
|
||||||
|
{{ $message }}
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
@endcan
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<!-- Mailer Details -->
|
||||||
|
<div class="col-12">
|
||||||
|
<h4 class="pt-4 mb-0 pb-2">Mailer Details</h4>
|
||||||
|
|
||||||
|
<!-- Mailer Ports -->
|
||||||
|
<div class="pt-0 row">
|
||||||
|
<div class="col-3">
|
||||||
|
@foreach (\App\Models\Mailer::all() as $mo)
|
||||||
|
@php($x=$o->mailers->find($mo))
|
||||||
|
<div class="pt-0 row">
|
||||||
|
<div class="col-12">
|
||||||
|
<label for="mailer_port_{{ $mo->id }}" class="form-label w-100">{{ $mo->name }} <span class="float-end text-warning">{{ $x?->pivot->last_poll }}</span></label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<span class="input-group-text"><i class="bi bi-modem-fill"></i></span>
|
||||||
|
<input type="text" class="form-control text-end @error('mailer_details.'.$mo->id.'.port') is-invalid @enderror" id="mailer_port_{{ $mo->id }}" placeholder="Port" name="mailer_details[{{ $mo->id }}][port]" value="{{ old('mailer_details.'.$mo->id.'.port',$x?->pivot->port) }}" @cannot($action,$o)readonly @endcannot>
|
||||||
|
<div class="input-group-text">
|
||||||
|
<input type="checkbox" class="form-control-input" name="mailer_details[{{ $mo->id }}][active]" value="1" title="Active" @if(old('mailer_details.'.$mo->id.'.active',$x?->pivot->active))checked @endif>
|
||||||
|
</div>
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('mailer_details.'.$mo->id.'.port')
|
||||||
|
{{ $message }}
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Mail Packet -->
|
||||||
|
<div class="col-2">
|
||||||
|
<label for="pkt_type" class="form-label">Mail Packet</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text"><i class="bi bi-ui-radios"></i></span>
|
||||||
|
<select class="form-select @error('pkt_type') is-invalid @enderror" id="pkt_type" name="pkt_type" @cannot($action,$o)readonly @endcannot>
|
||||||
|
@foreach (\App\Classes\FTN\Packet::PACKET_TYPES as $type => $class)
|
||||||
|
<option value="{{ $type }}" @if(old('pkt_type',$o->pkt_type ?: config('fido.packet_default')) === $type)selected @endif>{{ $type }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('pkt_type')
|
||||||
|
{{ $message }}
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="offset-3 col-4 @if((old('pollmode') === "0") || is_null($o->pollmode))d-none @endif" id="heartbeat_option">
|
||||||
|
@can('admin',$o)
|
||||||
|
<div class="row p-0">
|
||||||
|
<div class="offset-3 col-6">
|
||||||
|
<label for="method" class="form-label">Heartbeat <i class="bi bi-info-circle" title="Attempt contact after last seen"></i></label>
|
||||||
|
<div class="input-group has-validation">
|
||||||
|
<span class="input-group-text"><i class="bi bi-hourglass-bottom"></i></span>
|
||||||
|
<input type="text" class="form-control text-end @error('heartbeat') is-invalid @enderror" id="heartbeat" placeholder="Hours" name="heartbeat" value="{{ old('heartbeat',$o->heartbeat) }}">
|
||||||
|
<span class="invalid-feedback" role="alert">
|
||||||
|
@error('heartbeat')
|
||||||
|
{{ $message }}
|
||||||
|
@enderror
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endcan
|
||||||
|
|
||||||
|
@if (! is_null($o->pollmode))
|
||||||
|
<div class="row">
|
||||||
|
<div class="offset-3 col-9 bg-secondary rounded p-2 small">
|
||||||
|
@if($job = $o->poll())
|
||||||
|
<div class="row p-0">
|
||||||
|
<div class="col-4 text-dark">
|
||||||
|
@if($job->attempts)Last: @else Scheduled: @endif
|
||||||
|
</div>
|
||||||
|
<div class="col-8">
|
||||||
|
<strong class="highlight">{{ $job->created_at }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4 text-dark">
|
||||||
|
Attempts:
|
||||||
|
</div>
|
||||||
|
<div class="col-8">
|
||||||
|
<strong class="highlight">{{ $job->attempts ?: 0 }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if ($job->attempts)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4 text-dark">
|
||||||
|
Next:
|
||||||
|
</div>
|
||||||
|
<div class="col-8">
|
||||||
|
<strong class="highlight">{{ $job->available_at->diffForHumans(now(),$job->available_at->isFuture() ? \Carbon\CarbonInterface::DIFF_ABSOLUTE : \Carbon\CarbonInterface::DIFF_RELATIVE_TO_NOW) }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@else
|
||||||
|
<div class="row p-0">
|
||||||
|
<div class="col-4 text-dark">
|
||||||
|
Last Poll:
|
||||||
|
</div>
|
||||||
|
<div class="col-8">
|
||||||
|
<strong class="highlight">{{ ($x=$o->logs->where('originate',TRUE)->last())?->created_at ?: 'Never' }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4 text-dark">
|
||||||
|
Method:
|
||||||
|
</div>
|
||||||
|
<div class="col-8">
|
||||||
|
<strong class="highlight">{{ $x ? $x->mailer->name : '-' }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if ($o->heartbeat)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4 text-dark">
|
||||||
|
Next Heartbeat:
|
||||||
|
</div>
|
||||||
|
<div class="col-8">
|
||||||
|
<strong class="highlight">{{ $x ? $x->created_at->addHours($o->heartbeat) : Carbon::now() }}</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4 text-dark">
|
||||||
|
Status:
|
||||||
|
</div>
|
||||||
|
<div class="col-8">
|
||||||
|
<strong class="highlight">
|
||||||
|
@if ($job) Queued
|
||||||
|
@elseif ($o->autohold)Auto Hold
|
||||||
|
@else
|
||||||
|
@switch($o->pollmode)
|
||||||
|
@case(TRUE) Crash @break;
|
||||||
|
@case(FALSE) Normal @break;
|
||||||
|
@default Hold
|
||||||
|
@endswitch
|
||||||
|
@endif
|
||||||
|
</strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
{{--
|
||||||
|
<div class="col-12">
|
||||||
|
<table class="table monotable m-0 p-0 small noborder">
|
||||||
|
<tbody xstyle="border-style:dotted;">
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td class="cap text-end">Status :</td>
|
||||||
|
<td>
|
||||||
|
@if ($job) Queued
|
||||||
|
@elseif ($o->autohold)Auto Hold
|
||||||
|
@else
|
||||||
|
@switch($o->pollmode)
|
||||||
|
@case(TRUE) Crash @break;
|
||||||
|
@case(FALSE) Normal @break;
|
||||||
|
@default Hold
|
||||||
|
@endswitch
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
--}}
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<!-- BBS Details -->
|
||||||
|
<div class="col-12">
|
||||||
|
<h4 class="pt-4 mb-0 pb-2">BBS Details</h4>
|
||||||
|
|
||||||
|
<div class="pt-0 row">
|
||||||
|
<div class="col-2">
|
||||||
|
<label for="method" class="form-label">Connection Method</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text"><i class="bi bi-wifi"></i></span>
|
||||||
|
<select class="form-select @error('method') is-invalid @enderror" id="method" name="method" @cannot($action,$o)readonly @endcannot>
|
||||||
|
<option></option>
|
||||||
|
<option value="23" @if(old('method',$o->method) == 23)selected @endif>Telnet</option>
|
||||||
|
<option value="22" @if(old('method',$o->method) == 22)selected @endif>SSH</option>
|
||||||
|
<option value="519" @if(old('method',$o->method) == 519)selected @endif>Rlogin</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-2">
|
||||||
|
<label for="method" class="form-label">Port</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text"><i class="bi bi-wifi"></i></span>
|
||||||
|
<input type="text" class="form-control text-end @error('port') is-invalid @enderror" id="port" placeholder="Port" name="port" value="{{ old('port',$o->port) }}" @cannot($action,$o)readonly @endcannot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@can('admin',$o)
|
||||||
|
<div class="row">
|
||||||
|
<!-- Notes -->
|
||||||
|
<div class="col-12">
|
||||||
|
<label for="notes" class="form-label">Notes</label>
|
||||||
|
<textarea class="form-control" rows=3 name="notes" placeholder="Notes...">{{ old('notes',$o->notes) }}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endcan
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
@if($o->exists)
|
||||||
|
@can($action,$o)
|
||||||
|
<a href="{{ url('system') }}" class="btn btn-danger">Cancel</a>
|
||||||
|
<button type="submit" name="submit" class="btn btn-success float-end">@if ($o->exists)Save @else Add @endif</button>
|
||||||
|
@else
|
||||||
|
<input type="hidden" name="system_id" value="{{ $o->id }}">
|
||||||
|
<span><small><strong>NOTE:</strong> You'll be able to update these details after registration is completed.</small></span>
|
||||||
|
<button type="submit" class="btn btn-success float-end" name="submit" value="register">Register</button>
|
||||||
|
@endcan
|
||||||
|
@else
|
||||||
|
<button type="submit" class="btn btn-success float-end" name="submit" value="create">Register</button>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@section('page-css')
|
||||||
|
@css('select2')
|
||||||
|
@append
|
||||||
|
@section('page-scripts')
|
||||||
|
@js('select2')
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#users').select2({
|
||||||
|
@cannot('admin')disabled: true @endcannot
|
||||||
|
/*multiple: true*/
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#poll_normal').on('click',function() {
|
||||||
|
$('#heartbeat_option').removeClass('d-none');
|
||||||
|
})
|
||||||
|
$('#poll_crash').on('click',function() {
|
||||||
|
$('#heartbeat_option').removeClass('d-none');
|
||||||
|
})
|
||||||
|
$('#poll_hold').on('click',function() {
|
||||||
|
$('#heartbeat_option').addClass('d-none');
|
||||||
|
console.log('hold');
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
@append
|
@ -1,441 +0,0 @@
|
|||||||
<!-- $o = System::class -->
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xl-9 col-12">
|
|
||||||
<div class="row pt-0">
|
|
||||||
<div class="col-12">
|
|
||||||
<h4 class="mb-0 pb-2">System Users</h4>
|
|
||||||
|
|
||||||
<div class="row pt-0">
|
|
||||||
<!-- Users -->
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="users" class="form-label">Owners</label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-people-fill"></i></span>
|
|
||||||
<select style="width: 80%;" class="form-select @error('users') is-invalid @enderror" id="users" name="users[]">
|
|
||||||
<option value=""> </option>
|
|
||||||
@foreach (\App\Models\User::orderBy('name')->active()->get() as $uo)
|
|
||||||
<option value="{{ $uo->id }}" @if(in_array($uo->id,old('users',$o->users->pluck('id')->toArray())))selected @endif>{{ $uo->name }} <small>({{ $uo->email }})</small></option>
|
|
||||||
@endforeach
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('users')
|
|
||||||
{{ $message }}
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row pt-4">
|
|
||||||
<div class="col-12">
|
|
||||||
<h4 class="mb-0 pb-2">System Details</h4>
|
|
||||||
|
|
||||||
<div class="row pt-0">
|
|
||||||
<!-- Name -->
|
|
||||||
<div class="col-7">
|
|
||||||
<label for="name" class="form-label">BBS Name</label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-pc"></i></span>
|
|
||||||
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" placeholder="Name" name="name" value="{{ old('name',$o->name) }}" required @cannot('update',$o)readonly @endcannot autofocus>
|
|
||||||
<span id="search-icon" style="width: 0;"><i style="border-radius: 50%;" class="spinner-border spinner-border-sm text-dark d-none"></i></span>
|
|
||||||
<div id="system_search_results"></div>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('name')
|
|
||||||
{{ $message }}
|
|
||||||
@else
|
|
||||||
A name is required.
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- ZeroTier ID -->
|
|
||||||
<div class="col-5">
|
|
||||||
<label for="zt_id" class="form-label">ZeroTier ID</label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-shield-lock-fill"></i></span>
|
|
||||||
<input type="text" class="form-control @error('zt_id') is-invalid @enderror" id="zt_id" placeholder="ZeroTier" name="zt_id" value="{{ old('zt_id',$o->zt_id) }}" @cannot($action,$o)readonly @endcannot>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('zt_id')
|
|
||||||
{{ $message }}
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<!-- Sysop -->
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="sysop" class="form-label">Sysop</label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-person-fill"></i></span>
|
|
||||||
<input type="text" class="form-control @error('sysop') is-invalid @enderror" id="sysop" placeholder="Sysop" name="sysop" value="{{ old('sysop',$o->sysop) }}" required @cannot('admin',$o)readonly @endcannot autocomplete="name">
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('sysop')
|
|
||||||
{{ $message }}
|
|
||||||
@else
|
|
||||||
A Sysop's name is required.
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Location -->
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="location" class="form-label">Location</label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-globe"></i></span>
|
|
||||||
<input type="text" class="form-control @error('location') is-invalid @enderror" id="location" placeholder="Location" name="location" value="{{ old('location',$o->location) }}" required @cannot($action,$o)readonly @endcannot>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('location')
|
|
||||||
{{ $message }}
|
|
||||||
@else
|
|
||||||
System location is required.
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<!-- Address -->
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="address" class="form-label">BBS Internet Hostname</label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-globe"></i></span>
|
|
||||||
<input type="text" class="w-75 form-control @error('address') is-invalid @enderror" id="address" placeholder="FQDN" name="address" value="{{ old('address',$o->address) }}" @cannot($action,$o)readonly @endcannot>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('address')
|
|
||||||
{{ $message }}
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Phone -->
|
|
||||||
<div class="col-4">
|
|
||||||
<label for="phone" class="form-label">Phone</label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-telephone-fill"></i></span>
|
|
||||||
<input type="text" class="form-control @error('phone') is-invalid @enderror" id="phone" placeholder="Phone" name="phone" value="{{ old('phone',$o->phone) }}" @cannot($action,$o)readonly @endcannot>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('phone')
|
|
||||||
{{ $message }}
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row pt-4">
|
|
||||||
<!-- Mailer Details -->
|
|
||||||
<div class="col-12">
|
|
||||||
<h4 class="mb-0 pb-2">Mailer Details</h4>
|
|
||||||
|
|
||||||
<!-- Mailer Ports -->
|
|
||||||
<div class="row pt-0">
|
|
||||||
<div class="col-3">
|
|
||||||
@foreach (\App\Models\Mailer::all() as $mo)
|
|
||||||
@php($x=$o->mailers->find($mo))
|
|
||||||
<div class="row pt-0">
|
|
||||||
<div class="col-12">
|
|
||||||
<label for="mailer_port_{{ $mo->id }}" class="form-label w-100">{{ $mo->name }} <span class="float-end text-warning">{{ $x?->pivot->last_poll }}</span></label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-modem-fill"></i></span>
|
|
||||||
<input type="text" class="form-control text-end @error('mailer_details.'.$mo->id.'.port') is-invalid @enderror" id="mailer_port_{{ $mo->id }}" placeholder="Port" name="mailer_details[{{ $mo->id }}][port]" value="{{ old('mailer_details.'.$mo->id.'.port',$x?->pivot->port) }}" @cannot($action,$o)readonly @endcannot>
|
|
||||||
<div class="input-group-text">
|
|
||||||
<input type="checkbox" class="form-control-input" name="mailer_details[{{ $mo->id }}][active]" value="1" title="Active" @if(old('mailer_details.'.$mo->id.'.active',$x?->pivot->active))checked @endif>
|
|
||||||
</div>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('mailer_details.'.$mo->id.'.port')
|
|
||||||
{{ $message }}
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endforeach
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Mail Packet -->
|
|
||||||
<div class="col-4">
|
|
||||||
<label for="pkt_type" class="form-label">Mail Packet</label>
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-text"><i class="bi bi-ui-radios"></i></span>
|
|
||||||
<select class="form-select @error('pkt_type') is-invalid @enderror" id="pkt_type" name="pkt_type" @cannot($action,$o)readonly @endcannot>
|
|
||||||
@foreach (\App\Classes\FTN\Packet::PACKET_TYPES as $type => $class)
|
|
||||||
<option value="{{ $type }}" @if(old('pkt_type',$o->pkt_type ?: config('fido.packet_default')) === $type)selected @endif>{{ $type }}</option>
|
|
||||||
@endforeach
|
|
||||||
</select>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('pkt_type')
|
|
||||||
{{ $message }}
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row pt-4">
|
|
||||||
<!-- BBS Details -->
|
|
||||||
<div class="col-12">
|
|
||||||
<h4 class="mb-0 pb-2">BBS Details</h4>
|
|
||||||
|
|
||||||
<div class="row pt-0">
|
|
||||||
<div class="col-4">
|
|
||||||
<label for="method" class="form-label">Connection Method</label>
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-text"><i class="bi bi-wifi"></i></span>
|
|
||||||
<select class="form-select @error('method') is-invalid @enderror" id="method" name="method" @cannot($action,$o)readonly @endcannot>
|
|
||||||
<option></option>
|
|
||||||
<option value="23" @if(old('method',$o->method) == 23)selected @endif>Telnet</option>
|
|
||||||
<option value="22" @if(old('method',$o->method) == 22)selected @endif>SSH</option>
|
|
||||||
<option value="519" @if(old('method',$o->method) == 519)selected @endif>Rlogin</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-3">
|
|
||||||
<label for="method" class="form-label">Port</label>
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-text"><i class="bi bi-wifi"></i></span>
|
|
||||||
<input type="text" class="form-control text-end @error('port') is-invalid @enderror" id="port" placeholder="Port" name="port" value="{{ old('port',$o->port) }}" @cannot($action,$o)readonly @endcannot>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-xl-3 col-12">
|
|
||||||
<div class="row">
|
|
||||||
<!-- Active -->
|
|
||||||
<div class="col-6">
|
|
||||||
@can('update',$o)
|
|
||||||
<label for="active" class="form-label">Active</label>
|
|
||||||
<div class="input-group">
|
|
||||||
<div class="btn-group" role="group">
|
|
||||||
<input type="radio" class="btn-check" name="active" id="active_yes" value="1" required @if(old('active',$o->active))checked @endif>
|
|
||||||
<label class="btn btn-outline-success" for="active_yes">Yes</label>
|
|
||||||
|
|
||||||
<input type="radio" class="btn-check btn-danger" name="active" id="active_no" value="0" required @if(! old('active',$o->active))checked @endif>
|
|
||||||
<label class="btn btn-outline-danger" for="active_no">No</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endcan
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<!-- Hold -->
|
|
||||||
<div class="col-6">
|
|
||||||
@can('update',$o)
|
|
||||||
<label for="hold" class="form-label">Hold Mail <i class="bi bi-info-circle" title="Dont give the node any mail regardless of poll mode"></i></label>
|
|
||||||
<div class="input-group">
|
|
||||||
<div class="btn-group" role="group">
|
|
||||||
<input type="radio" class="btn-check" name="hold" id="hold_yes" value="1" required @if(old('hold',$o->hold))checked @endif>
|
|
||||||
<label class="btn btn-outline-warning" for="hold_yes">Yes</label>
|
|
||||||
|
|
||||||
<input type="radio" class="btn-check btn-danger" name="hold" id="hold_no" value="0" required @if(! old('hold',$o->hold))checked @endif>
|
|
||||||
<label class="btn btn-outline-success" for="hold_no">No</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endcan
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<!-- Poll Mode -->
|
|
||||||
<div class="col-12">
|
|
||||||
@can('update',$o)
|
|
||||||
<label for="pollmode" class="form-label">Poll Mode <i class="bi bi-info-circle" title="Poll node when mail available, poll on a schedule or hold mail for collection"></i></label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<div class="btn-group @error('pollmode') is-invalid @enderror" role="group">
|
|
||||||
<input type="radio" class="btn-check" name="pollmode" id="poll_crash" value="2" @if((int)old('pollmode',($o->pollmode === TRUE) ? 2 : 0) === 2)checked @endif>
|
|
||||||
<label class="btn btn-outline-success" for="poll_crash">Crash</label>
|
|
||||||
|
|
||||||
<input type="radio" class="btn-check btn-danger" name="pollmode" id="poll_normal" value="1" @if((int)old('pollmode',($o->pollmode === FALSE) ? 1 : 0) === 1)checked @endif>
|
|
||||||
<label class="btn btn-outline-secondary" for="poll_normal">Normal</label>
|
|
||||||
|
|
||||||
<input type="radio" class="btn-check btn-danger" name="pollmode" id="poll_hold" value="0" @if((int)old('pollmode',is_null($o->pollmode) ? 0 : 1) === 0)checked @endif>
|
|
||||||
<label class="btn btn-outline-warning" for="poll_hold">Hold</label>
|
|
||||||
</div>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('pollmode')
|
|
||||||
{{ $message }}
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
@endcan
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 @if((old('pollmode') === "0") || is_null($o->pollmode))d-none @endif" id="heartbeat_option">
|
|
||||||
@can('admin',$o)
|
|
||||||
<div class="row p-0">
|
|
||||||
<div class="col-6">
|
|
||||||
<label for="heartbeat" class="form-label">Heartbeat <i class="bi bi-info-circle" title="Attempt contact after last seen"></i></label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-hourglass-bottom"></i></span>
|
|
||||||
<input type="text" class="form-control text-end @error('heartbeat') is-invalid @enderror" id="heartbeat" placeholder="Hrs" name="heartbeat" value="{{ old('heartbeat',$o->heartbeat) }}">
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('heartbeat')
|
|
||||||
{{ $message }}
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endcan
|
|
||||||
|
|
||||||
@if (! is_null($o->pollmode))
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 bg-secondary rounded p-2 small">
|
|
||||||
@if($job = $o->poll())
|
|
||||||
<div class="row p-0">
|
|
||||||
<div class="col-4 text-dark">
|
|
||||||
@if($job->attempts)Last: @else Scheduled: @endif
|
|
||||||
</div>
|
|
||||||
<div class="col-8">
|
|
||||||
<strong class="highlight">{{ $job->created_at }}</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-4 text-dark">
|
|
||||||
Attempts:
|
|
||||||
</div>
|
|
||||||
<div class="col-8">
|
|
||||||
<strong class="highlight">{{ $job->attempts ?: 0 }}</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@if ($job->attempts)
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-4 text-dark">
|
|
||||||
Next:
|
|
||||||
</div>
|
|
||||||
<div class="col-8">
|
|
||||||
<strong class="highlight">{{ $job->available_at->diffForHumans(now(),$job->available_at->isFuture() ? \Carbon\CarbonInterface::DIFF_ABSOLUTE : \Carbon\CarbonInterface::DIFF_RELATIVE_TO_NOW) }}</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@else
|
|
||||||
<div class="row p-0">
|
|
||||||
<div class="col-4 text-dark">
|
|
||||||
Last Poll:
|
|
||||||
</div>
|
|
||||||
<div class="col-8">
|
|
||||||
<strong class="highlight">{{ ($x=$o->logs->where('originate',TRUE)->last())?->created_at ?: 'Never' }}</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-4 text-dark">
|
|
||||||
Method:
|
|
||||||
</div>
|
|
||||||
<div class="col-8">
|
|
||||||
<strong class="highlight">{{ $x ? $x->mailer->name : '-' }}</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@if ($o->heartbeat)
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-4 text-dark">
|
|
||||||
Next Heartbeat:
|
|
||||||
</div>
|
|
||||||
<div class="col-8">
|
|
||||||
<strong class="highlight">{{ $x ? $x->created_at->addHours($o->heartbeat) : Carbon::now() }}</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
@endif
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-4 text-dark">
|
|
||||||
Status:
|
|
||||||
</div>
|
|
||||||
<div class="col-8">
|
|
||||||
<strong class="highlight">
|
|
||||||
@if ($job) Queued
|
|
||||||
@elseif ($o->autohold)Auto Hold
|
|
||||||
@else
|
|
||||||
@switch($o->pollmode)
|
|
||||||
@case(TRUE) Crash @break;
|
|
||||||
@case(FALSE) Normal @break;
|
|
||||||
@default Hold
|
|
||||||
@endswitch
|
|
||||||
@endif
|
|
||||||
</strong>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@can('admin',$o)
|
|
||||||
<div class="row">
|
|
||||||
<!-- Notes -->
|
|
||||||
<div class="col-12">
|
|
||||||
<label for="notes" class="form-label">Notes</label>
|
|
||||||
<textarea class="form-control" rows=3 name="notes" placeholder="Notes...">{{ old('notes',$o->notes) }}</textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endcan
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12">
|
|
||||||
@if($o->exists)
|
|
||||||
@can($action,$o)
|
|
||||||
<a href="{{ url('system') }}" class="btn btn-danger">Cancel</a>
|
|
||||||
<button type="submit" name="submit" class="btn btn-success float-end">@if ($o->exists)Save @else Add @endif</button>
|
|
||||||
@else
|
|
||||||
<input type="hidden" name="system_id" value="{{ $o->id }}">
|
|
||||||
<span><small><strong>NOTE:</strong> You'll be able to update these details after registration is completed.</small></span>
|
|
||||||
<button type="submit" class="btn btn-success float-end" name="submit" value="register">Register</button>
|
|
||||||
@endcan
|
|
||||||
@else
|
|
||||||
<button type="submit" class="btn btn-success float-end" name="submit" value="create">Register</button>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@section('page-css')
|
|
||||||
@css('select2')
|
|
||||||
@append
|
|
||||||
@section('page-scripts')
|
|
||||||
@js('select2')
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
$(document).ready(function() {
|
|
||||||
$('#users').select2({
|
|
||||||
@cannot('admin')disabled: true @endcannot
|
|
||||||
/*multiple: true*/
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#poll_normal').on('click',function() {
|
|
||||||
$('#heartbeat_option').removeClass('d-none');
|
|
||||||
})
|
|
||||||
$('#poll_crash').on('click',function() {
|
|
||||||
$('#heartbeat_option').removeClass('d-none');
|
|
||||||
})
|
|
||||||
$('#poll_hold').on('click',function() {
|
|
||||||
$('#heartbeat_option').addClass('d-none');
|
|
||||||
console.log('hold');
|
|
||||||
})
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
@append
|
|
@ -1,4 +1,3 @@
|
|||||||
<!-- $o=User::class -->
|
|
||||||
@extends('layouts.app')
|
@extends('layouts.app')
|
||||||
|
|
||||||
@section('htmlheader_title')
|
@section('htmlheader_title')
|
||||||
@ -6,14 +5,14 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
@includeWhen(session()->has('success'),'widgets.success-row',['msg'=>session()->get('success')])
|
|
||||||
|
|
||||||
<div class="greyframe titledbox shadow0xb0">
|
<div class="greyframe titledbox shadow0xb0">
|
||||||
|
<div class="row pt-0">
|
||||||
|
<div class="col-12">
|
||||||
<h2 class="cap">@if($o->exists) Update @else Add @endif User</h2>
|
<h2 class="cap">@if($o->exists) Update @else Add @endif User</h2>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@ -21,7 +20,7 @@
|
|||||||
<label for="name" class="form-label">Name</label>
|
<label for="name" class="form-label">Name</label>
|
||||||
<div class="input-group has-validation">
|
<div class="input-group has-validation">
|
||||||
<span class="input-group-text"><i class="bi bi-tag-fill"></i></span>
|
<span class="input-group-text"><i class="bi bi-tag-fill"></i></span>
|
||||||
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" placeholder="Name" name="name" value="{{ old('name',$o->name) }}" autocomplete="name" required @cannot('admin',$o)disabled @endcannot autofocus>
|
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" placeholder="Name" name="name" value="{{ old('name',$o->name) }}" required @cannot('admin',$o)disabled @endcannot autofocus>
|
||||||
<span class="invalid-feedback" role="alert">
|
<span class="invalid-feedback" role="alert">
|
||||||
@error('name')
|
@error('name')
|
||||||
{{ $message }}
|
{{ $message }}
|
||||||
@ -36,7 +35,7 @@
|
|||||||
<label for="alias" class="form-label">BBS Alias</label>
|
<label for="alias" class="form-label">BBS Alias</label>
|
||||||
<div class="input-group has-validation">
|
<div class="input-group has-validation">
|
||||||
<span class="input-group-text"><i class="bi bi-tag-fill"></i></span>
|
<span class="input-group-text"><i class="bi bi-tag-fill"></i></span>
|
||||||
<input type="text" class="form-control @error('alias') is-invalid @enderror" id="alias" placeholder="alias" name="alias" value="{{ old('alias',$o->alias) }}" @cannot('update',$o)disabled @endcannot>
|
<input type="text" class="form-control @error('alias') is-invalid @enderror" id="alias" placeholder="alias" name="alias" value="{{ old('alias',$o->alias) }}" @cannot('admin',$o)disabled @endcannot>
|
||||||
<span class="invalid-feedback" role="alert">
|
<span class="invalid-feedback" role="alert">
|
||||||
@error('alias')
|
@error('alias')
|
||||||
{{ $message }}
|
{{ $message }}
|
||||||
@ -46,12 +45,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Forward Netmail -->
|
<!-- Forward Netmail -->
|
||||||
@can('admin',$o)
|
|
||||||
<div class="col-4">
|
<div class="col-4">
|
||||||
<label for="system_id" class="form-label">Forward Netmails</label>
|
<label for="system_id" class="form-label">Forward Netmails</label>
|
||||||
<div class="input-group has-validation">
|
<div class="input-group has-validation">
|
||||||
<span class="input-group-text"><i class="bi bi-envelope-at-fill"></i></span>
|
<span class="input-group-text"><i class="bi bi-envelope-at-fill"></i></span>
|
||||||
<select style="width: 80%;" class="form-select @error('system_id') is-invalid @enderror" id="system_id" name="system_id" required>
|
<select style="width: 80%;" class="form-select @error('system_id') is-invalid @enderror" id="system_id" name="system_id" required @cannot('admin',$o)disabled @endcannot>
|
||||||
<option value=""> </option>
|
<option value=""> </option>
|
||||||
@foreach ($o->systems as $oo)
|
@foreach ($o->systems as $oo)
|
||||||
<option value="{{ $oo->id }}" @if(old('system_id',$o->system_id)==$oo->id)selected @endif>{{ $oo->name }}</option>
|
<option value="{{ $oo->id }}" @if(old('system_id',$o->system_id)==$oo->id)selected @endif>{{ $oo->name }}</option>
|
||||||
@ -64,7 +62,6 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endcan
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@ -72,7 +69,7 @@
|
|||||||
<label for="email" class="form-label">Email</label>
|
<label for="email" class="form-label">Email</label>
|
||||||
<div class="input-group has-validation">
|
<div class="input-group has-validation">
|
||||||
<span class="input-group-text"><i class="bi bi-person-badge"></i></span>
|
<span class="input-group-text"><i class="bi bi-person-badge"></i></span>
|
||||||
<input type="text" class="form-control @error('email') is-invalid @enderror" id="email" placeholder="Email" name="email" value="{{ old('email',$o->email) }}" autocomplete="email" required @cannot('update',$o)disabled @endcannot>
|
<input type="text" class="form-control @error('email') is-invalid @enderror" id="email" placeholder="Email" name="email" value="{{ old('email',$o->email) }}" required @cannot('admin',$o)disabled @endcannot>
|
||||||
<span class="invalid-feedback" role="alert">
|
<span class="invalid-feedback" role="alert">
|
||||||
@error('email')
|
@error('email')
|
||||||
{{ $message }}
|
{{ $message }}
|
||||||
@ -83,56 +80,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-4">
|
|
||||||
<label for="password" class="form-label">Password</label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<span class="input-group-text"><i class="bi bi-person-badge"></i></span>
|
|
||||||
<input type="password" class="form-control @error('password') is-invalid @enderror" id="password" placeholder="{{ old('password',$o->password) ? 'Password Unchanged' : 'Password' }}" name="password" value="" @cannot('update',$o)disabled @endcannot>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('password')
|
|
||||||
{{ $message }}
|
|
||||||
@else
|
|
||||||
Password required for login.
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-1">
|
<div class="col-1">
|
||||||
@can('ownes',$o)
|
<label for="active" class="form-label">Active</label>
|
||||||
<label for="passkey" class="form-label">Passkey</label>
|
|
||||||
<div class="input-group has-validation">
|
|
||||||
<button class="btn {{ $o->passkey ? 'btn-primary' : 'btn-outline-primary' }}" id="passkey"><i class="bi bi-key"></i></button>
|
|
||||||
<span class="invalid-feedback" role="alert">
|
|
||||||
@error('passkey')
|
|
||||||
{{ $message }}
|
|
||||||
@enderror
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
@endcan
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@can('admin',$o)
|
|
||||||
<div class="col-3">
|
|
||||||
<div class="row p-0">
|
|
||||||
<div class="col-xl-6 col-12">
|
|
||||||
<span class="form-label" style="font-size: 75%; margin-bottom: 1px;">Active</span>
|
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
<input type="radio" class="btn-check" name="active" id="active_yes" value="1" required @if(old('active',$o->active))checked @endif>
|
<input type="radio" class="btn-check" name="active" id="active_yes" value="1" required @cannot('admin',$o)disabled @endcannot @if(old('active',$o->active))checked @endif>
|
||||||
<label class="btn btn-outline-success" for="active_yes">Yes</label>
|
<label class="btn btn-outline-success" for="active_yes">Yes</label>
|
||||||
|
|
||||||
<input type="radio" class="btn-check btn-danger" name="active" id="active_no" value="0" required @if(! old('active',$o->active))checked @endif>
|
<input type="radio" class="btn-check btn-danger" name="active" id="active_no" value="0" required @cannot('admin',$o)disabled @endcannot @if(! old('active',$o->active))checked @endif>
|
||||||
<label class="btn btn-outline-danger" for="active_no">No</label>
|
<label class="btn btn-outline-danger" for="active_no">No</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-xl-6 col-12">
|
<div class="offset-1 col-1">
|
||||||
<span class="form-label" style="font-size: 75%; margin-bottom: 1px;">Site Admin</span>
|
<label for="admin" class="form-label">Site Admin</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<div class="btn-group" role="group" @if($user->id === $o->id)data-bs-toggle="tooltip" title="You cannot demote yourself" @endif>
|
<div class="btn-group" role="group" @if($user->id === $o->id)data-bs-toggle="tooltip" title="You cannot demote yourself" @endif>
|
||||||
<input type="radio" class="btn-check" name="admin" id="admin_yes" value="1" required @if(old('admin',$o->admin))checked @endif>
|
<input type="radio" class="btn-check" name="admin" id="admin_yes" value="1" required @cannot('admin',$o)disabled @endcannot @if(old('admin',$o->admin))checked @endif>
|
||||||
<label class="btn btn-outline-success" for="admin_yes">Yes</label>
|
<label class="btn btn-outline-success" for="admin_yes">Yes</label>
|
||||||
|
|
||||||
<input type="radio" class="btn-check btn-danger" name="admin" id="admin_no" value="0" required @if(($user->id === $o->id) || $user->cannot('admin',$o)) disabled @endif @if(! old('admin',$o->admin))checked @endif>
|
<input type="radio" class="btn-check btn-danger" name="admin" id="admin_no" value="0" required @if(($user->id === $o->id) || $user->cannot('admin',$o)) disabled @endif @if(! old('admin',$o->admin))checked @endif>
|
||||||
@ -141,14 +106,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
@endcan
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<label for="pgp_pubkey" class="form-label">PGP Public Key</label>
|
<label for="pgp_pubkey" class="form-label">PGP Public Key</label>
|
||||||
<textarea class="form-control @error('pgp_pubkey')is-invalid @enderror" rows=3 id="pgp_pubkey" name="pgp_pubkey" placeholder="PGP Public Key..." @cannot('update',$o)disabled @endcannot>{{ old('pgp_pubkey',$o->pgp_pubkey) }}</textarea>
|
<textarea class="form-control @error('pgp_pubkey')is-invalid @enderror" rows=3 name="pgp_pubkey" placeholder="PGP Public Key..." @cannot('admin',$o)disabled @endcannot>{{ old('pgp_pubkey',$o->pgp_pubkey) }}</textarea>
|
||||||
<span class="invalid-feedback" role="alert">
|
<span class="invalid-feedback" role="alert">
|
||||||
@error('pgp_pubkey')
|
@error('pgp_pubkey')
|
||||||
{{ $message }}
|
{{ $message }}
|
||||||
@ -159,8 +121,8 @@
|
|||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<a href="{{ back()->getTargetUrl() }}" class="btn btn-danger">Cancel</a>
|
<a href="{{ url('user') }}" class="btn btn-danger">Cancel</a>
|
||||||
@canany(['admin','update'],$o)
|
@can('admin',$o)
|
||||||
<button type="submit" name="submit" class="btn btn-success float-end">@if ($o->exists)Save @else Add @endif</button>
|
<button type="submit" name="submit" class="btn btn-success float-end">@if ($o->exists)Save @else Add @endif</button>
|
||||||
@endcan
|
@endcan
|
||||||
</div>
|
</div>
|
||||||
@ -168,8 +130,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row pt-5">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h3>Systems</h3>
|
<h3>Systems</h3>
|
||||||
|
|
||||||
@ -210,11 +174,8 @@
|
|||||||
@section('page-scripts')
|
@section('page-scripts')
|
||||||
@js('select2')
|
@js('select2')
|
||||||
|
|
||||||
<!-- Passkeys -->
|
|
||||||
<script type='text/javascript' src='{{ asset('/passkey/passkey.js') }}'></script>
|
|
||||||
|
|
||||||
@if($user->id === $o->id)
|
@if($user->id === $o->id)
|
||||||
<script type="text/javascript">
|
<script>
|
||||||
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
|
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
|
||||||
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
||||||
return new bootstrap.Tooltip(tooltipTriggerEl)
|
return new bootstrap.Tooltip(tooltipTriggerEl)
|
||||||
@ -225,37 +186,6 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
$('#system_id').select2();
|
$('#system_id').select2();
|
||||||
$('#passkey').on('click',function(item) {
|
|
||||||
if (passkey_debug)
|
|
||||||
console.log('Passkey: Create Click');
|
|
||||||
|
|
||||||
// Availability of `window.PublicKeyCredential` means WebAuthn is usable.
|
|
||||||
// `isUserVerifyingPlatformAuthenticatorAvailable` means the feature detection is usable.
|
|
||||||
// `sConditionalMediationAvailable` means the feature detection is usable.
|
|
||||||
if (window.PublicKeyCredential &&
|
|
||||||
PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable &&
|
|
||||||
PublicKeyCredential.isConditionalMediationAvailable) {
|
|
||||||
// Check if user verifying platform authenticator is available.
|
|
||||||
Promise.all([
|
|
||||||
PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable(),
|
|
||||||
PublicKeyCredential.isConditionalMediationAvailable(),
|
|
||||||
]).then(results => {
|
|
||||||
if (passkey_debug)
|
|
||||||
console.log('Passkey: Browser Supported');
|
|
||||||
|
|
||||||
if (results.every(r => r === true)) {
|
|
||||||
passkey_register('{{ csrf_token() }}',$(this),'bi-key','btn-primary','{{ $o->passkey ? 'btn-primary' : 'btn-outline-primary' }}');
|
|
||||||
} else {
|
|
||||||
alert('It seems that passkey is NOT supported by your browse (B)');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
|
||||||
alert('It seems that passkey is NOT supported by your browser (A)');
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@append
|
@append
|
@ -4,11 +4,15 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
|
<div class="row">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<h2>System Users</h2>
|
<h2>System Users</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<p>This system is aware of the following users (you can <a href="{{ url('user/addedit') }}">add</a> more):</p>
|
<div class="col-12">
|
||||||
|
<p>This system is aware of the following users @can('admin',(new \App\Models\User))(you can <a href="{{ url('user/addedit') }}">add</a> more)@endcan:</p>
|
||||||
<table class="table monotable" id="user">
|
<table class="table monotable" id="user">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
@ -4,13 +4,11 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<input type="hidden" id="address_id" name="address_id">
|
<input type="hidden" id="address_id" name="address_id">
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="greyframe titledbox shadow0xb0">
|
<div class="greyframe titledbox shadow0xb0">
|
||||||
<h2 class="cap">Enter your Link code</h2>
|
<h2 class="cap">Enter your Link code</h2>
|
||||||
|
|
||||||
@ -69,8 +67,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" autocomplete="off" novalidate>
|
<form class="row g-0 needs-validation" method="post" autocomplete="off" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -27,14 +27,14 @@
|
|||||||
|
|
||||||
<p>Otherwise, if all is good, we'll send a netmail to <strong class="highlight">{{ $o->sysop }}</strong> at <strong class="highlight">{{ $o->access_mailer }}</strong></p> with further details.
|
<p>Otherwise, if all is good, we'll send a netmail to <strong class="highlight">{{ $o->sysop }}</strong> at <strong class="highlight">{{ $o->access_mailer }}</strong></p> with further details.
|
||||||
|
|
||||||
<form class="needs-validation" method="post" autocomplete="off" action="{{ url('user/system/link') }}" novalidate>
|
<form class="row g-0 needs-validation" method="post" autocomplete="off" action="{{ url('user/system/link') }}" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<input type="hidden" name="system_id" value="{{ $o->id }}">
|
<input type="hidden" name="system_id" value="{{ $o->id }}">
|
||||||
<input type="hidden" name="name" value="{{ $o->name }}">
|
<input type="hidden" name="name" value="{{ $o->name }}">
|
||||||
|
|
||||||
<div class="row pb-2">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12 pb-2">
|
||||||
<input type="submit" name="action" class="btn btn-success" value="Link">
|
<input type="submit" name="action" class="btn btn-success" value="Link">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
<div class="row">
|
|
||||||
<div class="col-8 m-auto">
|
|
||||||
@include('widgets.success')
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,5 +1,10 @@
|
|||||||
<!-- Success -->
|
<!-- Success -->
|
||||||
<div class="alert alert-success alert-dismissible fade show" role="alert">
|
@if(session()->has('success'))
|
||||||
<i class="bi bi-hand-thumbs-up"></i> {{ $msg }}
|
<div class="alert alert-success alert-dismissible fade show" role="alert">
|
||||||
<button type="button" class="btn btn-sm btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
<h4 class="text-success"><i class="bi bi-hand-thumbs-up"></i> Success!</h4>
|
||||||
</div>
|
<ul>
|
||||||
|
<li>{{ session()->get('success') }}</li>
|
||||||
|
</ul>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
@endif
|
@ -5,7 +5,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<form class="needs-validation" method="post" novalidate>
|
<form class="row g-0 needs-validation" method="post" novalidate>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
@ -50,15 +50,10 @@ Route::view('system/list','system.list');
|
|||||||
Route::get('system/view/{o}',[SystemController::class,'view'])
|
Route::get('system/view/{o}',[SystemController::class,'view'])
|
||||||
->where('o','[0-9]+');
|
->where('o','[0-9]+');
|
||||||
Route::get('search',[HomeController::class,'search']);
|
Route::get('search',[HomeController::class,'search']);
|
||||||
Route::view('user/permissions','auth.permissions');
|
|
||||||
|
|
||||||
Route::middleware(['auth','verified','activeuser'])->group(function () {
|
Route::middleware(['auth','verified','activeuser'])->group(function () {
|
||||||
Route::view('dashboard','dashboard');
|
Route::view('dashboard','dashboard');
|
||||||
|
|
||||||
/* ACCOUNT PATHS */
|
|
||||||
Route::match(['get','post'],'user/addedit/{o?}',[UserController::class,'add_edit'])
|
|
||||||
->where('o','[0-9]+');
|
|
||||||
|
|
||||||
/* DOMAIN PATHS */
|
/* DOMAIN PATHS */
|
||||||
Route::view('domain','domain.home');
|
Route::view('domain','domain.home');
|
||||||
Route::get('domain/api/hosts/{o}/{region}',[DomainController::class,'api_hosts'])
|
Route::get('domain/api/hosts/{o}/{region}',[DomainController::class,'api_hosts'])
|
||||||
@ -126,6 +121,7 @@ Route::middleware(['auth','verified','activeuser'])->group(function () {
|
|||||||
Route::post('packet/contents/{o}/{packet}',[HomeController::class,'packet_contents'])
|
Route::post('packet/contents/{o}/{packet}',[HomeController::class,'packet_contents'])
|
||||||
->where('o','[0-9]+')
|
->where('o','[0-9]+')
|
||||||
->where('packet','[[:xdigit:]]+');
|
->where('packet','[[:xdigit:]]+');
|
||||||
|
Route::get('permissions',[HomeController::class,'permissions']);
|
||||||
|
|
||||||
Route::match(['get','post'],'user/system/register',[SystemController::class,'register']);
|
Route::match(['get','post'],'user/system/register',[SystemController::class,'register']);
|
||||||
Route::match(['post'],'user/system/link',[SystemController::class,'system_link']);
|
Route::match(['post'],'user/system/link',[SystemController::class,'system_link']);
|
||||||
@ -147,5 +143,7 @@ Route::middleware(['auth','can:admin'])->group(function () {
|
|||||||
Route::match(['get','post'],'address/merge/{id}',[SystemController::class,'address_merge']);
|
Route::match(['get','post'],'address/merge/{id}',[SystemController::class,'address_merge']);
|
||||||
Route::match(['get','post'],'setup',[HomeController::class,'setup']);
|
Route::match(['get','post'],'setup',[HomeController::class,'setup']);
|
||||||
|
|
||||||
Route::view('user/list','user.list');
|
Route::view('user','user.home');
|
||||||
|
Route::match(['get','post'],'user/addedit/{o?}',[UserController::class,'add_edit'])
|
||||||
|
->where('o','[0-9]+');
|
||||||
});
|
});
|
Loading…
Reference in New Issue
Block a user