Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
71.43% covered (warning)
71.43%
20 / 28
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
CustomPasswordBroker
71.43% covered (warning)
71.43%
20 / 28
0.00% covered (danger)
0.00%
0 / 2
23.74
0.00% covered (danger)
0.00%
0 / 1
 getUser
87.50% covered (warning)
87.50%
14 / 16
0.00% covered (danger)
0.00%
0 / 1
9.16
 getCredentials
50.00% covered (danger)
50.00%
6 / 12
0.00% covered (danger)
0.00%
0 / 1
16.00
1<?php
2
3namespace App\Services;
4
5use App\Http\Models\Admin\AdminUserInvitation;
6use App\Http\Models\Auth\User;
7use Illuminate\Auth\Passwords\PasswordBroker as BasePasswordBroker;
8use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
9use Illuminate\Contracts\Support\Arrayable;
10use Illuminate\Database\Eloquent\Builder;
11use Illuminate\Support\Arr;
12use Illuminate\Support\Str;
13use UnexpectedValueException;
14
15class CustomPasswordBroker extends BasePasswordBroker
16{
17    /**
18     * Get the user for the given credentials.
19     *
20     *
21     * @throws \UnexpectedValueException
22     */
23    public function getUser(array $credentials)
24    {
25        $credentials = Arr::except($credentials, ['token']);
26
27        if (empty($credentials) ||
28           (count($credentials) === 1 &&
29            array_key_exists('password', $credentials))) {
30            return;
31        }
32
33        $query = User::query();
34
35        $user = $this->getCredentials($query, $credentials);
36
37        if (! $user) {
38            $query = AdminUserInvitation::query();
39
40            $user = $this->getCredentials($query, $credentials);
41        }
42
43        if (! $user) {
44            return null;
45        }
46
47        $user = strtolower($user->email) === strtolower($credentials['email']) ? $user : null;
48
49        if ($user && ! $user instanceof CanResetPasswordContract) {
50            throw new UnexpectedValueException('User must implement CanResetPassword interface.');
51        }
52
53        return $user;
54    }
55
56    private function getCredentials(Builder $query, array $credentials)
57    {
58        foreach ($credentials as $key => $value) {
59            if (Str::contains($key, 'password')) {
60                continue;
61            }
62
63            if (is_array($value) || $value instanceof Arrayable) {
64                if ($key == 'email') {
65                    foreach ($value as $key => $val) {
66                        $query->where('email', strtolower($val));
67                    }
68                } else {
69                    $query->whereIn($key, $value);
70                }
71            } else {
72                if ($key == 'email') {
73                    $query->where($key, strtolower($value));
74                } else {
75                    $query->where($key, $value);
76                }
77            }
78        }
79
80        return $query->first();
81    }
82}