Completed
Push — master ( 7d448a...f2ba2f )
by Robbie
13s queued 10s
created

SchemaGenerator::getBackupMethod()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 5
nc 3
nop 0
dl 0
loc 11
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\MFA\Service;
4
5
use SilverStripe\Core\Config\Config;
6
use SilverStripe\Core\Extensible;
7
use SilverStripe\Core\Injector\Injectable;
8
use SilverStripe\Core\Injector\Injector;
9
use SilverStripe\MFA\Extension\MemberExtension;
10
use SilverStripe\MFA\Method\MethodInterface;
11
use SilverStripe\MFA\State\AvailableMethodDetailsInterface;
12
use SilverStripe\MFA\State\RegisteredMethodDetailsInterface;
13
use SilverStripe\Security\Member;
14
15
/**
16
 * Generates a multi-factor authentication frontend app schema from the given request
17
 */
18
class SchemaGenerator
19
{
20
    use Extensible;
21
    use Injectable;
22
23
    /**
24
     * Gets the schema data for the multi factor authentication app, using the current Member as context
25
     *
26
     * @param Member&MemberExtension $member
27
     * @return array
28
     */
29
    public function getSchema(Member $member)
30
    {
31
        $enforcementManager = EnforcementManager::singleton();
32
33
        $registeredMethods = $this->getRegisteredMethods($member);
34
35
        // Skip registration details if the user has already registered this method
36
        $exclude = array_map(function (RegisteredMethodDetailsInterface $methodDetails) {
37
            return $methodDetails->getURLSegment();
38
        }, $registeredMethods);
39
40
        $schema = [
41
            'registeredMethods' => $registeredMethods,
42
            'availableMethods' => $this->getAvailableMethods($exclude),
43
            'defaultMethod' => $this->getDefaultMethod($member),
44
            'backupMethod' => $this->getBackupMethod(),
45
            'canSkip' => $enforcementManager->canSkipMFA($member),
46
            'isFullyRegistered' => $enforcementManager->hasCompletedRegistration($member),
47
            'shouldRedirect' => $enforcementManager->shouldRedirectToMFA($member),
48
        ];
49
50
        $this->extend('updateSchema', $schema);
51
52
        return $schema;
53
    }
54
55
    /**
56
     * Get a list of methods registered to the user
57
     *
58
     * @param Member&MemberExtension $member
59
     * @return RegisteredMethodDetailsInterface[]
60
     */
61
    protected function getRegisteredMethods(Member $member)
62
    {
63
        $registeredMethodDetails = [];
64
        foreach ($member->RegisteredMFAMethods() as $registeredMethod) {
65
            $registeredMethodDetails[] = $registeredMethod->getDetails();
66
        }
67
        return $registeredMethodDetails;
68
    }
69
70
    /**
71
     * Get details in a list for all available methods, optionally excluding those with urlSegments provided in
72
     * $exclude
73
     *
74
     * @param array $exclude
75
     * @return AvailableMethodDetailsInterface[]
76
     */
77
    protected function getAvailableMethods(array $exclude = [])
78
    {
79
        // Prepare an array to hold details for methods available to register
80
        $availableMethods = [];
81
82
        // Get all methods enabled on the site
83
        $methodRegistry = MethodRegistry::singleton();
84
        $allMethods = $methodRegistry->getMethods();
85
86
        // Compile details for methods that aren't already registered to the user
87
        foreach ($allMethods as $method) {
88
            // Omit specified exclusions or methods that are configured as back-up methods
89
            if (in_array($method->getURLSegment(), $exclude) || $methodRegistry->isBackupMethod($method)) {
90
                continue;
91
            }
92
            $availableMethods[] = $method->getDetails();
93
        }
94
95
        return $availableMethods;
96
    }
97
98
    /**
99
     * Get the URL Segment for the configured default method on the current member, or null if none is configured
100
     *
101
     * @param Member&MemberExtension $member
102
     * @return string|null
103
     */
104
    protected function getDefaultMethod(Member $member)
105
    {
106
        $defaultMethod = $member->DefaultRegisteredMethod;
107
        return $defaultMethod ? $defaultMethod->getMethod()->getURLSegment() : null;
108
    }
109
110
    /**
111
     * Get the "details" of the configured back-up method (if set)
112
     *
113
     * @return AvailableMethodDetailsInterface|null
114
     */
115
    protected function getBackupMethod()
116
    {
117
        $methodClass = Config::inst()->get(MethodRegistry::class, 'default_backup_method');
118
        if (!$methodClass) {
119
            return null;
120
        }
121
122
        /** @var MethodInterface $method */
123
        $method = Injector::inst()->create($methodClass);
124
125
        return $method ? $method->getDetails() : null;
0 ignored issues
show
introduced by
$method is of type SilverStripe\MFA\Method\MethodInterface, thus it always evaluated to true.
Loading history...
126
    }
127
}
128