forked from projects/thebadspace
ro
43e0004ac5
The process for updating blocklists per source wasn't effecient, so it has been rewritten to process each source individually before moving on, relieving some processing load on the server and ensuring every source comes back with data, even in the event it doesn't grab it the first time. also removed the recent list from the index page as the recently updated list doesn't reflect what's been the last to get updated and changed the theme color to match the current palette.
111 lines
3.7 KiB
PHP
111 lines
3.7 KiB
PHP
<?php
|
|
|
|
namespace App\Repositories;
|
|
|
|
use App\Models\Source;
|
|
use Carbon\Carbon;
|
|
use GuzzleHttp\Exception\ConnectException;
|
|
|
|
class SourceRepository
|
|
{
|
|
protected $source;
|
|
protected $missing;
|
|
protected $updated;
|
|
protected $sources;
|
|
|
|
public function __construct(Source $source)
|
|
{
|
|
$this->source = $source;
|
|
$this->missing = [];
|
|
$this->updated = [];
|
|
$this->sources = $source::where("active", true)->get();
|
|
}
|
|
|
|
public function getActive()
|
|
{
|
|
return $this->source::where("active", true)->get();
|
|
}
|
|
|
|
public function updateSourceData($index = 0)
|
|
{
|
|
//$sources = $this->getActive();
|
|
//checks all the sources to refresh data
|
|
$count = count($this->sources);
|
|
if ($count == 0) {
|
|
return [
|
|
'checked' => $this->updated,
|
|
'notchecked' => $this->missing,
|
|
'count' => $count,
|
|
'updated' => 'false',
|
|
];
|
|
} else {
|
|
//check index
|
|
if ($index <= $count - 1) {
|
|
$source = $this->sources[$index];
|
|
$result = $this->getMastoBlocklist($source);
|
|
if (count($result) > 0) {
|
|
$source->list_data = json_encode($result);
|
|
$source->last_updated = Carbon::now();
|
|
$source->save();
|
|
array_push($this->updated, ['source' => $source->url]);
|
|
$index++;
|
|
$result = $this->updateSourceData($index);
|
|
} else {
|
|
//if empty run the same index again
|
|
array_push($this->missing, ['source' => $source->url]);
|
|
$result = $this->updateSourceData($index);
|
|
}
|
|
} else {
|
|
//continue
|
|
}
|
|
return [
|
|
'checked' => $this->updated,
|
|
'notchecked' => $this->missing,
|
|
'count' => $count,
|
|
'updated' => 'true',
|
|
];
|
|
}
|
|
}
|
|
|
|
private function getMastoBlocklist($source)
|
|
{
|
|
$result = [];
|
|
if ($source['type'] == 'mastodon') {
|
|
if ($source['token'] == null) {
|
|
try {
|
|
$result = \Mastodon::domain('https://' . $source['url'])
|
|
->get('/instance/domain_blocks');
|
|
//array_push($checked, ['source' => $source->url]);
|
|
} catch (ConnectException $e) {
|
|
//dd($source);
|
|
//array_push($missing, ['source' => $source->url]);
|
|
}
|
|
} else {
|
|
try {
|
|
$result = \Mastodon::domain('https://' . $source['url'])
|
|
->token($source['token'])
|
|
->get('/instance/domain_blocks');
|
|
//array_push($checked, ['source' => $source->url]);
|
|
} catch (ConnectException $e) {
|
|
//array_push($missing, ['source' => $source->url]);
|
|
//dd($source);
|
|
}
|
|
}
|
|
} elseif ($source['type'] == 'custom' && $source['format'] == 'csv') {
|
|
try {
|
|
$denylist = array_map('str_getcsv', file('https://' . $source['url']));
|
|
foreach ($denylist as $item) {
|
|
array_push($result, [
|
|
'domain' => $item[0],
|
|
'severity' => $item[1],
|
|
'comment' => $item[2]]);
|
|
}
|
|
array_push($checked, ['source' => $source->url]);
|
|
} catch (Exception $e) {
|
|
array_push($missing, ['source' => $source->url]);
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
}
|