|
@@ -0,0 +1,99 @@
|
|
|
|
+<?php
|
|
|
|
+
|
|
|
|
+namespace App\Console\Commands;
|
|
|
|
+
|
|
|
|
+use Illuminate\Console\Command;
|
|
|
|
+use App\User;
|
|
|
|
+use App\Models\UserDomainBlock;
|
|
|
|
+use function Laravel\Prompts\text;
|
|
|
|
+use function Laravel\Prompts\confirm;
|
|
|
|
+use function Laravel\Prompts\progress;
|
|
|
|
+
|
|
|
|
+class AddUserDomainBlock extends Command
|
|
|
|
+{
|
|
|
|
+ /**
|
|
|
|
+ * The name and signature of the console command.
|
|
|
|
+ *
|
|
|
|
+ * @var string
|
|
|
|
+ */
|
|
|
|
+ protected $signature = 'app:add-user-domain-block';
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * The console command description.
|
|
|
|
+ *
|
|
|
|
+ * @var string
|
|
|
|
+ */
|
|
|
|
+ protected $description = 'Apply a domain block to all users';
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Execute the console command.
|
|
|
|
+ */
|
|
|
|
+ public function handle()
|
|
|
|
+ {
|
|
|
|
+ $domain = text('Enter domain you want to block');
|
|
|
|
+ $domain = $this->validateDomain($domain);
|
|
|
|
+ $this->processBlocks($domain);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ protected function validateDomain($domain)
|
|
|
|
+ {
|
|
|
|
+ if(!strpos($domain, '.')) {
|
|
|
|
+ $this->error('Invalid domain');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(str_starts_with($domain, 'https://')) {
|
|
|
|
+ $domain = str_replace('https://', '', $domain);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(str_starts_with($domain, 'http://')) {
|
|
|
|
+ $domain = str_replace('http://', '', $domain);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $valid = filter_var($domain, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME|FILTER_NULL_ON_FAILURE);
|
|
|
|
+ if(!$valid) {
|
|
|
|
+ $this->error('Invalid domain');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $domain = strtolower(parse_url('https://' . $domain, PHP_URL_HOST));
|
|
|
|
+
|
|
|
|
+ if($domain === config('pixelfed.domain.app')) {
|
|
|
|
+ $this->error('Invalid domain');
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $confirmed = confirm('Are you sure you want to block ' . $domain . '?');
|
|
|
|
+ if(!$confirmed) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return $domain;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ protected function processBlocks($domain)
|
|
|
|
+ {
|
|
|
|
+ progress(
|
|
|
|
+ label: 'Updating user domain blocks...',
|
|
|
|
+ steps: User::lazyById(500),
|
|
|
|
+ callback: fn ($user) => $this->performTask($user, $domain),
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ protected function performTask($user, $domain)
|
|
|
|
+ {
|
|
|
|
+ if(!$user->profile_id || $user->delete_after) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if($user->status != null && $user->status != 'disabled') {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ UserDomainBlock::updateOrCreate([
|
|
|
|
+ 'profile_id' => $user->profile_id,
|
|
|
|
+ 'domain' => $domain
|
|
|
|
+ ]);
|
|
|
|
+ }
|
|
|
|
+}
|