1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- <?php
- namespace App\Http\Requests;
- use App\Models\ProfileMigration;
- use App\Services\FetchCacheService;
- use App\Services\WebfingerService;
- use Illuminate\Foundation\Http\FormRequest;
- use Illuminate\Validation\Validator;
- class ProfileMigrationStoreRequest extends FormRequest
- {
- /**
- * Determine if the user is authorized to make this request.
- */
- public function authorize(): bool
- {
- if ((bool) config_cache('federation.activitypub.enabled') === false ||
- (bool) config_cache('federation.migration') === false) {
- return false;
- }
- if (! $this->user() || $this->user()->status) {
- return false;
- }
- return true;
- }
- /**
- * Get the validation rules that apply to the request.
- *
- * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
- */
- public function rules(): array
- {
- return [
- 'acct' => 'required|email',
- 'password' => 'required|current_password',
- ];
- }
- public function after(): array
- {
- return [
- function (Validator $validator) {
- $err = $this->validateNewAccount();
- if ($err !== 'noerr') {
- $validator->errors()->add(
- 'acct',
- $err
- );
- }
- },
- ];
- }
- protected function validateNewAccount()
- {
- if (ProfileMigration::whereProfileId($this->user()->profile_id)->where('created_at', '>', now()->subDays(30))->exists()) {
- return 'Error - You have migrated your account in the past 30 days, you can only perform a migration once per 30 days.';
- }
- $acct = WebfingerService::rawGet($this->acct);
- if (! $acct) {
- return 'The new account you provided is not responding to our requests.';
- }
- $pr = FetchCacheService::getJson($acct);
- if (! $pr || ! isset($pr['alsoKnownAs'])) {
- return 'Invalid account lookup response.';
- }
- if (! count($pr['alsoKnownAs']) || ! is_array($pr['alsoKnownAs'])) {
- return 'The new account does not contain an alias to your current account.';
- }
- $curAcctUrl = $this->user()->profile->permalink();
- if (! in_array($curAcctUrl, $pr['alsoKnownAs'])) {
- return 'The new account does not contain an alias to your current account.';
- }
- return 'noerr';
- }
- }
|