Completed
Pull Request — master (#107)
by Simon
02:49
created

AnnotatePermissionChecker::classNameIsAllowed()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 10
nc 2
nop 1
dl 0
loc 16
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace SilverLeague\IDEAnnotator\Helpers;
4
5
use Psr\Container\NotFoundExceptionInterface;
6
use ReflectionException;
7
use SilverLeague\IDEAnnotator\DataObjectAnnotator;
8
use SilverStripe\Control\Controller;
9
use SilverStripe\Control\Director;
10
use SilverStripe\Core\Config\Config;
11
use SilverStripe\Core\Extension;
12
use SilverStripe\Core\Injector\Injector;
13
use SilverStripe\Core\Manifest\ModuleManifest;
14
use SilverStripe\ORM\DataExtension;
15
use SilverStripe\ORM\DataObject;
16
17
/**
18
 * Class AnnotatePermissionChecker
19
 *
20
 * Helperclass to check if the current environment, class or module is allowed to be annotated.
21
 * This is abstracted from @see DataObjectAnnotator to separate and clean up.
22
 *
23
 * @package IDEAnnotator/Helpers
24
 */
25
class AnnotatePermissionChecker
26
{
27
28
    /**
29
     * In the future we will support other Classes as well.
30
     * We list the core classes, but in fact only it's subclasses are supported
31
     * @see AnnotatePermissionChecker::classNameIsSupported();
32
     */
33
    protected $supportedParentClasses = [
34
        DataObject::class,
35
        DataExtension::class,
36
        Controller::class,
37
        Extension::class
38
    ];
39
40
    /**
41
     * @return bool
42
     */
43
    public function environmentIsAllowed()
44
    {
45
        if (!$this->isEnabled()) {
46
            return false;
47
        }
48
49
        return Director::isDev();
50
    }
51
52
    /**
53
     * @return bool
54
     */
55
    public function isEnabled()
56
    {
57
        return (bool)Config::inst()->get(DataObjectAnnotator::class, 'enabled');
58
    }
59
60
    /**
61
     * @return array
62
     */
63
    public function getSupportedParentClasses()
64
    {
65
        return $this->supportedParentClasses;
66
    }
67
68
    /**
69
     * Check if a DataObject or DataExtension subclass is allowed by checking if the file
70
     * is in the $allowed_modules array
71
     * The permission is checked by matching the filePath and modulePath
72
     *
73
     * @param $className
74
     *
75
     * @return bool
76
     * @throws NotFoundExceptionInterface
77
     * @throws ReflectionException
78
     */
79
    public function classNameIsAllowed($className)
80
    {
81
        if ($this->classNameIsSupported($className)) {
82
            $classInfo = new AnnotateClassInfo($className);
83
            $filePath = $classInfo->getClassFilePath();
84
            $module = Injector::inst()->createWithArgs(
85
                ModuleManifest::class,
86
                [Director::baseFolder()]
87
            )->getModuleByPath($filePath);
88
89
            $allowedModules = (array)Config::inst()->get(DataObjectAnnotator::class, 'enabled_modules');
90
91
            return in_array($module->getName(), $allowedModules, true);
92
        }
93
94
        return false;
95
    }
96
97
    /**
98
     * Check if a (subclass of ) class is a supported
99
     *
100
     * @param $className
101
     * @return bool
102
     */
103
    public function classNameIsSupported($className)
104
    {
105
        foreach ($this->supportedParentClasses as $supportedParent) {
106
            if (is_subclass_of($className, $supportedParent)) {
107
                return true;
108
            }
109
        }
110
111
        return false;
112
    }
113
114
    /**
115
     * Check if a module is in the $allowed_modules array
116
     * Required for the buildTask.
117
     *
118
     * @param string $moduleName
119
     *
120
     * @return bool
121
     */
122
    public function moduleIsAllowed($moduleName)
123
    {
124
        return in_array($moduleName, $this->enabledModules(), null);
125
    }
126
127
    /**
128
     * @return array
129
     */
130
    public function enabledModules()
131
    {
132
        $enabled = (array)Config::inst()->get(DataObjectAnnotator::class, 'enabled_modules');
133
134
        // modules might be enabled more then once.
135
        return array_combine($enabled, $enabled);
136
    }
137
}
138