mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-04 05:27:33 -05:00 
			
		
		
		
	Refactor password reset for admin users
This commit is contained in:
		
							parent
							
								
									08e280e651
								
							
						
					
					
						commit
						120d2c21ab
					
				@ -12,8 +12,10 @@
 | 
				
			|||||||
namespace App\Http\Controllers\Auth;
 | 
					namespace App\Http\Controllers\Auth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use App\Http\Controllers\Controller;
 | 
					use App\Http\Controllers\Controller;
 | 
				
			||||||
 | 
					use App\Libraries\MultiDB;
 | 
				
			||||||
use Illuminate\Contracts\View\Factory;
 | 
					use Illuminate\Contracts\View\Factory;
 | 
				
			||||||
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
 | 
					use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
 | 
				
			||||||
 | 
					use Illuminate\Http\Request;
 | 
				
			||||||
use Illuminate\Support\Facades\Auth;
 | 
					use Illuminate\Support\Facades\Auth;
 | 
				
			||||||
use Illuminate\Support\Facades\Password;
 | 
					use Illuminate\Support\Facades\Password;
 | 
				
			||||||
use Illuminate\View\View;
 | 
					use Illuminate\View\View;
 | 
				
			||||||
@ -65,4 +67,31 @@ class ContactForgotPasswordController extends Controller
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return Password::broker('contacts');
 | 
					        return Password::broker('contacts');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function sendResetLinkEmail(Request $request)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        //MultiDB::userFindAndSetDb($request->input('email'));
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        $user = MultiDB::hasContact(['email' => $request->input('email')]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->validateEmail($request);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // We will send the password reset link to this user. Once we have attempted
 | 
				
			||||||
 | 
					        // to send the link, we will examine the response then see the message we
 | 
				
			||||||
 | 
					        // need to show to the user. Finally, we'll send out a proper response.
 | 
				
			||||||
 | 
					        $response = $this->broker()->sendResetLink(
 | 
				
			||||||
 | 
					            $this->credentials($request)
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($request->ajax()) {
 | 
				
			||||||
 | 
					            return $response == Password::RESET_LINK_SENT
 | 
				
			||||||
 | 
					                ? response()->json(['message' => 'Reset link sent to your email.', 'status' => true], 201)
 | 
				
			||||||
 | 
					                : response()->json(['message' => 'Email not found', 'status' => false], 401);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $response == Password::RESET_LINK_SENT
 | 
				
			||||||
 | 
					            ? $this->sendResetLinkResponse($request, $response)
 | 
				
			||||||
 | 
					            : $this->sendResetLinkFailedResponse($request, $response);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,7 @@
 | 
				
			|||||||
namespace App\Http\Controllers\Auth;
 | 
					namespace App\Http\Controllers\Auth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use App\Http\Controllers\Controller;
 | 
					use App\Http\Controllers\Controller;
 | 
				
			||||||
 | 
					use App\Libraries\MultiDB;
 | 
				
			||||||
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
 | 
					use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
 | 
				
			||||||
use Illuminate\Http\Request;
 | 
					use Illuminate\Http\Request;
 | 
				
			||||||
use Illuminate\Support\Facades\Password;
 | 
					use Illuminate\Support\Facades\Password;
 | 
				
			||||||
@ -103,6 +104,10 @@ class ForgotPasswordController extends Controller
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function sendResetLinkEmail(Request $request)
 | 
					    public function sendResetLinkEmail(Request $request)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        //MultiDB::userFindAndSetDb($request->input('email'));
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        $user = MultiDB::hasUser(['email' => $request->input('email')]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $this->validateEmail($request);
 | 
					        $this->validateEmail($request);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // We will send the password reset link to this user. Once we have attempted
 | 
					        // We will send the password reset link to this user. Once we have attempted
 | 
				
			||||||
 | 
				
			|||||||
@ -142,6 +142,31 @@ class MultiDB
 | 
				
			|||||||
        return null;
 | 
					        return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param array $data
 | 
				
			||||||
 | 
					     * @return User|null
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static function hasContact(array $data) : ?ClientContact
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (! config('ninja.db.multi_db_enabled')) {
 | 
				
			||||||
 | 
					            return ClientContact::where($data)->withTrashed()->first();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        foreach (self::$dbs as $db) {
 | 
				
			||||||
 | 
					            self::setDB($db);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            $user = ClientContacts::where($data)->withTrashed()->first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ($user) {
 | 
				
			||||||
 | 
					                return $user;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self::setDefaultDatabase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static function contactFindAndSetDb($token) :bool
 | 
					    public static function contactFindAndSetDb($token) :bool
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        foreach (self::$dbs as $db) {
 | 
					        foreach (self::$dbs as $db) {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										53
									
								
								app/Mail/Admin/ResetPasswordObject.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								app/Mail/Admin/ResetPasswordObject.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Invoice Ninja (https://invoiceninja.com).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @link https://github.com/invoiceninja/invoiceninja source repository
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @license https://opensource.org/licenses/AAL
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace App\Mail\Admin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ResetPasswordObject
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public $user;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public $token;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public $company;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function __construct($token, $user, $company)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->token = $token;
 | 
				
			||||||
 | 
					        $this->user = $user;
 | 
				
			||||||
 | 
					        $this->company = $company;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function build()
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $data = [
 | 
				
			||||||
 | 
					            'title' => ctrans('texts.your_password_reset_link'),
 | 
				
			||||||
 | 
					            'message' => ctrans('texts.reset_password'),
 | 
				
			||||||
 | 
					            'url' => route('password.reset', ['token' => $this->token, 'email' => $this->user->email]),
 | 
				
			||||||
 | 
					            'button' => ctrans('texts.reset'),
 | 
				
			||||||
 | 
					            'signature' => $this->company->settings->email_signature,
 | 
				
			||||||
 | 
					            'settings' => $this->company->settings,
 | 
				
			||||||
 | 
					            'logo' => $this->company->present()->logo(),
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $mail_obj = new \stdClass;
 | 
				
			||||||
 | 
					        $mail_obj->subject = ctrans('texts.your_password_reset_link');
 | 
				
			||||||
 | 
					        $mail_obj->data = $data;
 | 
				
			||||||
 | 
					        $mail_obj->markdown = 'email.admin.generic';
 | 
				
			||||||
 | 
					        $mail_obj->tag = $this->company->company_key;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $mail_obj;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -11,6 +11,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace App\Models;
 | 
					namespace App\Models;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use App\Jobs\Mail\NinjaMailer;
 | 
				
			||||||
 | 
					use App\Jobs\Mail\NinjaMailerJob;
 | 
				
			||||||
 | 
					use App\Jobs\Mail\NinjaMailerObject;
 | 
				
			||||||
 | 
					use App\Mail\Admin\ResetPasswordObject;
 | 
				
			||||||
use App\Models\Presenters\UserPresenter;
 | 
					use App\Models\Presenters\UserPresenter;
 | 
				
			||||||
use App\Notifications\ResetPasswordNotification;
 | 
					use App\Notifications\ResetPasswordNotification;
 | 
				
			||||||
use App\Utils\Traits\MakesHash;
 | 
					use App\Utils\Traits\MakesHash;
 | 
				
			||||||
@ -371,6 +375,15 @@ class User extends Authenticatable implements MustVerifyEmail
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function sendPasswordResetNotification($token)
 | 
					    public function sendPasswordResetNotification($token)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->notify(new ResetPasswordNotification($token));
 | 
					
 | 
				
			||||||
 | 
					        $nmo = new NinjaMailerObject;
 | 
				
			||||||
 | 
					        $nmo->mailable = new NinjaMailer( (new ResetPasswordObject($token, $this, $this->account->default_company))->build());
 | 
				
			||||||
 | 
					        $nmo->to_user = $this;
 | 
				
			||||||
 | 
					        $nmo->settings = $this->account->default_company->settings;
 | 
				
			||||||
 | 
					        $nmo->company = $this->account->default_company;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        NinjaMailerJob::dispatch($nmo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //$this->notify(new ResetPasswordNotification($token));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,73 +0,0 @@
 | 
				
			|||||||
<?php
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Invoice Ninja (https://invoiceninja.com).
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @link https://github.com/invoiceninja/invoiceninja source repository
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * @license https://opensource.org/licenses/AAL
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace App\Notifications;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use Illuminate\Bus\Queueable;
 | 
					 | 
				
			||||||
use Illuminate\Contracts\Queue\ShouldQueue;
 | 
					 | 
				
			||||||
use Illuminate\Foundation\Bus\Dispatchable;
 | 
					 | 
				
			||||||
use Illuminate\Notifications\Messages\MailMessage;
 | 
					 | 
				
			||||||
use Illuminate\Notifications\Notification;
 | 
					 | 
				
			||||||
use Illuminate\Queue\InteractsWithQueue;
 | 
					 | 
				
			||||||
use Illuminate\Queue\SerializesModels;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class GmailTestNotification extends Notification 
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
 //   use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Create a new notification instance.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @return void
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public function __construct()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        //
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Get the notification's delivery channels.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param  mixed  $notifiable
 | 
					 | 
				
			||||||
     * @return array
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public function via($notifiable)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return ['mail'];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Get the mail representation of the notification.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param  mixed  $notifiable
 | 
					 | 
				
			||||||
     * @return MailMessage
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public function toMail($notifiable)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return (new MailMessage)
 | 
					 | 
				
			||||||
                    ->line('The introduction to the notification.')
 | 
					 | 
				
			||||||
                    ->action('Notification Action', url('/'))
 | 
					 | 
				
			||||||
                    ->line('Thank you for using our application!');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Get the array representation of the notification.
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param  mixed  $notifiable
 | 
					 | 
				
			||||||
     * @return array
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public function toArray($notifiable)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return [
 | 
					 | 
				
			||||||
            //
 | 
					 | 
				
			||||||
        ];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -20,6 +20,7 @@ use Illuminate\Notifications\Notification;
 | 
				
			|||||||
use Illuminate\Queue\InteractsWithQueue;
 | 
					use Illuminate\Queue\InteractsWithQueue;
 | 
				
			||||||
use Illuminate\Queue\SerializesModels;
 | 
					use Illuminate\Queue\SerializesModels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//@deprecated
 | 
				
			||||||
class NewAccountCreated extends Notification
 | 
					class NewAccountCreated extends Notification
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    //use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 | 
					    //use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 | 
				
			||||||
@ -50,7 +51,7 @@ class NewAccountCreated extends Notification
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function via($notifiable)
 | 
					    public function via($notifiable)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return ['slack', 'mail'];
 | 
					        return ['slack'];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@ -61,26 +62,6 @@ class NewAccountCreated extends Notification
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function toMail($notifiable)
 | 
					    public function toMail($notifiable)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $user_name = $this->user->first_name.' '.$this->user->last_name;
 | 
					 | 
				
			||||||
        $email = $this->user->email;
 | 
					 | 
				
			||||||
        $ip = $this->user->ip;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $data = [
 | 
					 | 
				
			||||||
            'title' => ctrans('texts.new_signup'),
 | 
					 | 
				
			||||||
            'message' => ctrans('texts.new_signup_text', ['user' => $user_name, 'email' => $email, 'ip' => $ip]),
 | 
					 | 
				
			||||||
            'url' => config('ninja.web_url'),
 | 
					 | 
				
			||||||
            'button' => ctrans('texts.account_login'),
 | 
					 | 
				
			||||||
            'signature' => $this->company->settings->email_signature,
 | 
					 | 
				
			||||||
            'logo' => $this->company->present()->logo(),
 | 
					 | 
				
			||||||
            'settings' => $this->company->settings,
 | 
					 | 
				
			||||||
        ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return (new MailMessage)
 | 
					 | 
				
			||||||
                    ->subject(ctrans('texts.new_signup'))
 | 
					 | 
				
			||||||
                    ->withSwiftMessage(function ($message) {
 | 
					 | 
				
			||||||
                        $message->getHeaders()->addTextHeader('Tag', $this->company->company_key);
 | 
					 | 
				
			||||||
                    })
 | 
					 | 
				
			||||||
                    ->markdown('email.admin.generic', $data);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@ use Illuminate\Bus\Queueable;
 | 
				
			|||||||
use Illuminate\Notifications\Messages\MailMessage;
 | 
					use Illuminate\Notifications\Messages\MailMessage;
 | 
				
			||||||
use Illuminate\Notifications\Notification;
 | 
					use Illuminate\Notifications\Notification;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//@deprecated
 | 
				
			||||||
class ResetPasswordNotification extends Notification
 | 
					class ResetPasswordNotification extends Notification
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
//    use Queueable;
 | 
					//    use Queueable;
 | 
				
			||||||
@ -30,7 +31,7 @@ class ResetPasswordNotification extends Notification
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function via($notifiable)
 | 
					    public function via($notifiable)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return ['mail'];
 | 
					        return [];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,14 @@
 | 
				
			|||||||
@component('email.template.master', ['design' => 'light', 'whitelabel' => false])
 | 
					@component('email.template.master', ['design' => 'light', 'whitelabel' => false])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @slot('header')
 | 
					    @slot('header')
 | 
				
			||||||
        @include('email.components.header', ['logo' => 'https://www.invoiceninja.com/wp-content/uploads/2015/10/logo-white-horizontal-1.png'])
 | 
					        @include('email.components.header', ['logo' => $logo])
 | 
				
			||||||
    @endslot
 | 
					    @endslot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <p>You are receiving this email because we received a password reset request for your account.</p>
 | 
					    <p>{{ ctrans('texts.reset_password') }}</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <a href="{{ $link }}" target="_blank" class="button">
 | 
					    <a href="{{ $link }}" target="_blank" class="button">
 | 
				
			||||||
        Reset Password
 | 
					       {{ ctrans('texts.reset') }}
 | 
				
			||||||
    </a>
 | 
					    </a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <p>
 | 
					 | 
				
			||||||
        If you’re having trouble clicking the "Reset Password" button, copy and paste the URL below into your web
 | 
					 | 
				
			||||||
        browser:
 | 
					 | 
				
			||||||
    </p>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    <a href="{{ $link }}">{{ $link }}</a>
 | 
					    <a href="{{ $link }}">{{ $link }}</a>
 | 
				
			||||||
@endcomponent
 | 
					@endcomponent
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user