Implement 2D domain processing - mainly for fidonet
This commit is contained in:
parent
ed7dc2ab8b
commit
673c444acd
@ -702,19 +702,31 @@ class Message extends FTNBase
|
||||
$node = (int)$item;
|
||||
}
|
||||
|
||||
// If domain should be flattened, look for node regardless of zone (within the list of zones for the domain)
|
||||
if ($this->fdomain && $this->fdomain->flatten) {
|
||||
$ao = Address::findZone($this->fdomain,$net&DomainController::NUMBER_MAX,$node&DomainController::NUMBER_MAX);
|
||||
|
||||
$aoid = $ao?->id;
|
||||
|
||||
if (! $ao)
|
||||
$ftn = sprintf('%d:%d/%d',0,$net&DomainController::NUMBER_MAX,$node&DomainController::NUMBER_MAX);
|
||||
|
||||
} else {
|
||||
$ftn = sprintf('%d:%d/%d',$this->fz,$net&DomainController::NUMBER_MAX,$node&DomainController::NUMBER_MAX);
|
||||
|
||||
// @todo This should be enhanced to include the address at the time of the message.
|
||||
if ($aos->has($ftn))
|
||||
$ao = $aos->get($ftn);
|
||||
$aoid = $aos->get($ftn);
|
||||
else
|
||||
$aos->put($ftn,($ao=(Address::findFTN($ftn))?->id));
|
||||
$aos->put($ftn,($aoid=(Address::findFTN($ftn))?->id));
|
||||
}
|
||||
|
||||
if (! $ao) {
|
||||
if (! $aoid) {
|
||||
Log::alert(sprintf('%s:! Undefined Node [%s] in %s.',self::LOGKEY,$ftn,$type));
|
||||
$rogue->push($ftn);
|
||||
|
||||
} else {
|
||||
$nodes->push($ao);
|
||||
$nodes->push($aoid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ class PacketProcess extends Command
|
||||
$this->info(sprintf('Processing message from [%s] with msgid [%s] in (%s)',$msg->fboss,$msg->msgid,$f->pktName()));
|
||||
|
||||
// Dispatch job.
|
||||
Job::dispatchSync($msg,$f->pktName(),$a,$packet->fftn_o,Carbon::now(),$this->option('nobot'));
|
||||
Job::dispatchSync($msg,$f->pktName(),$a,$a,Carbon::now(),$this->option('nobot'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ namespace App\Http\Controllers;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
use App\Http\Requests\DomainRequest;
|
||||
use App\Models\{Address,Domain,Zone};
|
||||
|
||||
class DomainController extends Controller
|
||||
@ -15,20 +16,10 @@ class DomainController extends Controller
|
||||
/**
|
||||
* Add or edit a domain
|
||||
*/
|
||||
public function add_edit(Request $request,Domain $o)
|
||||
public function add_edit(DomainRequest $request,Domain $o)
|
||||
{
|
||||
if ($request->post()) {
|
||||
$this->authorize('admin',$o);
|
||||
|
||||
$request->validate([
|
||||
// http://ftsc.org/docs/old/fsp-1028.002
|
||||
'name' => 'required|max:8|regex:/^[a-z-_~]{1,8}$/|unique:domains,name,'.($o->exists ? $o->id : 0),
|
||||
'dnsdomain' => 'nullable|regex:/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i|unique:domains,dnsdomain,'.($o->exists ? $o->id : NULL),
|
||||
'active' => 'required|boolean',
|
||||
'public' => 'required|boolean',
|
||||
]);
|
||||
|
||||
foreach (['name','dnsdomain','active','public','homepage','notes'] as $key)
|
||||
foreach (['name','dnsdomain','active','public','homepage','notes','flatten'] as $key)
|
||||
$o->{$key} = $request->post($key);
|
||||
|
||||
$o->save();
|
||||
|
@ -18,7 +18,7 @@ class EchoareaController extends Controller
|
||||
|
||||
$request->validate([
|
||||
'domain_id' => 'required|exists:domains,id',
|
||||
'name' => 'required|min:4|max:35|regex:/^[a-zA-Z-_~]{4,}$/|unique:echoareas,name,'.($o->exists ? $o->id : 0),
|
||||
'name' => 'required|min:4|max:35|regex:/^[a-zA-Z0-9\-_~]{4,}$/|unique:echoareas,name,'.($o->exists ? $o->id : 0),
|
||||
'description' => 'required',
|
||||
'active' => 'required|boolean',
|
||||
'show' => 'required|boolean',
|
||||
|
33
app/Http/Requests/DomainRequest.php
Normal file
33
app/Http/Requests/DomainRequest.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
use App\Models\Domain;
|
||||
|
||||
class DomainRequest extends FormRequest
|
||||
{
|
||||
public function authorize(Domain $o)
|
||||
{
|
||||
return Gate::allows( 'admin',$o);
|
||||
}
|
||||
|
||||
public function rules(Request $request)
|
||||
{
|
||||
if (! $request->isMethod('post'))
|
||||
return [];
|
||||
|
||||
$o = $this->route('o');
|
||||
|
||||
return [
|
||||
'name' => 'required|max:8|regex:/^[a-z-_~]{1,8}$/|unique:domains,name,'.($o->exists ? $o->id : 0),
|
||||
'dnsdomain' => 'nullable|regex:/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i|unique:domains,dnsdomain,'.($o->exists ? $o->id : NULL),
|
||||
'active' => 'required|boolean',
|
||||
'public' => 'required|boolean',
|
||||
'flatten' => 'nullable|boolean',
|
||||
];
|
||||
}
|
||||
}
|
@ -402,7 +402,7 @@ class Address extends Model
|
||||
return $q
|
||||
->where(function($q) use ($ftn) {
|
||||
return $q->where('region_id',$ftn['n'])
|
||||
->where('host_id',0);
|
||||
->where('host_id',$ftn['n']);
|
||||
});
|
||||
})
|
||||
->where('node_id',$ftn['f'])
|
||||
@ -433,7 +433,7 @@ class Address extends Model
|
||||
return $q->where(function($qq) use ($ftn) {
|
||||
return $qq
|
||||
->where('region_id',$ftn['n'])
|
||||
->where('host_id',0);
|
||||
->where('host_id',$ftn['n']);
|
||||
})
|
||||
->orWhere(function($qq) use ($ftn) {
|
||||
return $qq
|
||||
@ -513,6 +513,50 @@ class Address extends Model
|
||||
return ($o && $o->system->active) ? $o : NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is to find an address for a domain (like fidonet), which is technically 2D even though it uses multiple zones.
|
||||
*
|
||||
* This was implemented to identify seenby and path kludges
|
||||
*
|
||||
* @param Domain $do
|
||||
* @param int $host
|
||||
* @param int $node
|
||||
* @param bool $trashed
|
||||
* @return self|null
|
||||
* @throws \Exception
|
||||
*/
|
||||
public static function findZone(Domain $do,int $host,int $node,bool $trashed=FALSE): ?self
|
||||
{
|
||||
if (! $do->flatten)
|
||||
throw new \Exception(sprintf('Domain is not set with flatten: %d',$do->id));
|
||||
|
||||
$zones = $do->zones->pluck('zone_id');
|
||||
|
||||
$o = (new self)
|
||||
->select('addresses.*')
|
||||
->join('zones',['zones.id'=>'addresses.zone_id'])
|
||||
//->join('domains',['domains.id'=>'zones.domain_id'])
|
||||
->when($trashed,function($query) {
|
||||
$query->trashed();
|
||||
},function($query) {
|
||||
$query->active();
|
||||
})
|
||||
->whereIN('zones.zone_id',$zones)
|
||||
->where(function($q) use ($host) {
|
||||
return $q
|
||||
->where(function($q) use ($host) {
|
||||
return $q->where('region_id',$host)
|
||||
->where('host_id',$host);
|
||||
})
|
||||
->orWhere('host_id',$host);
|
||||
})
|
||||
->where('node_id',$node)
|
||||
->where('zones.domain_id',$do->id)
|
||||
->single();
|
||||
|
||||
return $o;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an activation code for this address
|
||||
*
|
||||
|
28
database/migrations/2023_09_09_221103_domain_2d.php
Normal file
28
database/migrations/2023_09_09_221103_domain_2d.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('domains',function (Blueprint $table) {
|
||||
$table->boolean('flatten')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('domains',function (Blueprint $table) {
|
||||
$table->dropColumn('flatten');
|
||||
});
|
||||
}
|
||||
};
|
@ -29,7 +29,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-4">
|
||||
<div class="col-2">
|
||||
<label for="active" class="form-label">Active</label>
|
||||
<div class="input-group">
|
||||
<div class="btn-group" role="group">
|
||||
@ -42,6 +42,21 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-2">
|
||||
@if ($o->zones->count() > 1)
|
||||
<label for="flatten" class="form-label">Flatten Zones <i class="bi bi-info-circle" title="Treat this domain as a 2D domain"></i></label>
|
||||
<div class="input-group">
|
||||
<div class="btn-group" role="group">
|
||||
<input type="radio" class="btn-check" name="flatten" id="flatten_yes" value="1" required @if(old('flatten',$o->flatten))checked @endif>
|
||||
<label class="btn btn-outline-warning" for="flatten_yes">Yes</label>
|
||||
|
||||
<input type="radio" class="btn-check btn-danger" name="flatten" id="flatten_no" value="0" required @if(! old('flatten',$o->flatten))checked @endif>
|
||||
<label class="btn btn-outline-success" for="flatten_no">No</label>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="col-4">
|
||||
@if ($o->managed())
|
||||
@if ($o->nodelist_filename)
|
||||
|
Loading…
Reference in New Issue
Block a user