pixelfed/app/Console/Commands/FixUsernames.php

125 lines
3.6 KiB
PHP
Raw Normal View History

2018-12-24 00:16:59 +00:00
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\{Profile, User};
use DB;
2019-01-04 06:08:23 +00:00
use App\Util\Lexer\RestrictedNames;
2018-12-24 00:16:59 +00:00
class FixUsernames extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'fix:usernames';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Fix invalid usernames';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->info('Collecting data ...');
$affected = collect([]);
2019-01-04 06:08:23 +00:00
$restricted = RestrictedNames::get();
$users = User::chunk(100, function($users) use($affected, $restricted) {
2018-12-24 00:16:59 +00:00
foreach($users as $user) {
if($user->is_admin || $user->status == 'deleted') {
continue;
}
2019-01-04 06:08:23 +00:00
if(in_array($user->username, $restricted)) {
$affected->push($user);
}
2019-11-14 06:20:01 +00:00
$val = str_replace(['-', '_', '.'], '', $user->username);
2018-12-24 00:16:59 +00:00
if(!ctype_alnum($val)) {
$this->info('Found invalid username: ' . $user->username);
$affected->push($user);
}
}
});
if($affected->count() > 0) {
$this->info('Found: ' . $affected->count() . ' affected usernames');
$opts = [
'Random replace (assigns random username)',
'Best try replace (assigns alpha numeric username)',
2019-01-04 06:08:23 +00:00
'Manual replace (manually set username)',
'Skip (do not replace. Use at your own risk)'
2018-12-24 00:16:59 +00:00
];
foreach($affected as $u) {
$old = $u->username;
2019-01-04 06:08:23 +00:00
$this->info("Found user: {$old}");
$opt = $this->choice('Select fix method:', $opts, 3);
2018-12-24 00:16:59 +00:00
switch ($opt) {
case $opts[0]:
$new = "user_" . str_random(6);
$this->info('New username: ' . $new);
break;
case $opts[1]:
$new = filter_var($old, FILTER_SANITIZE_STRING|FILTER_FLAG_STRIP_LOW);
if(strlen($new) < 6) {
$new = $new . '_' . str_random(4);
}
$this->info('New username: ' . $new);
break;
case $opts[2]:
$new = $this->ask('Enter new username:');
$this->info('New username: ' . $new);
break;
2019-01-04 06:08:23 +00:00
case $opts[3]:
$new = false;
break;
2018-12-24 00:16:59 +00:00
default:
$new = "user_" . str_random(6);
break;
}
2019-01-04 06:08:23 +00:00
if($new) {
DB::transaction(function() use($u, $new) {
$profile = $u->profile;
$profile->username = $new;
$u->username = $new;
$u->save();
$profile->save();
});
}
2018-12-24 00:16:59 +00:00
$this->info('Selected: ' . $opt);
}
$this->info('Fixed ' . $affected->count() . ' usernames!');
2019-01-04 06:08:23 +00:00
} else {
$this->info('No affected usernames found!');
2018-12-24 00:16:59 +00:00
}
}
}