This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace Admingenerator\GeneratorBundle\Routing; |
||
4 | |||
5 | use Symfony\Component\Config\Loader\FileLoader; |
||
6 | use Symfony\Component\Config\Resource\FileResource; |
||
7 | use Symfony\Component\Routing\RouteCollection; |
||
8 | use Symfony\Component\Routing\Route; |
||
9 | use Symfony\Component\Finder\Finder; |
||
10 | use Symfony\Component\Yaml\Yaml; |
||
11 | |||
12 | class RoutingLoader extends FileLoader |
||
13 | { |
||
14 | // Assoc beetween a controller and its route path |
||
15 | //@todo make an object for this |
||
16 | protected $actions = array( |
||
17 | 'list' => array( |
||
18 | 'path' => '/', |
||
19 | 'defaults' => array(), |
||
20 | 'requirements' => array(), |
||
21 | 'methods' => array('GET'), |
||
22 | ), |
||
23 | 'excel'=> array( |
||
24 | 'path' => '/excel/{key}', |
||
25 | 'defaults' => array('key'=>null), |
||
26 | 'requirements' => array(), |
||
27 | 'methods' => array('GET'), |
||
28 | 'controller' => 'excel', |
||
29 | ), |
||
30 | 'edit' => array( |
||
31 | 'path' => '/{pk}/edit', |
||
32 | 'defaults' => array(), |
||
33 | 'requirements' => array(), |
||
34 | 'methods' => array('GET'), |
||
35 | ), |
||
36 | 'update' => array( |
||
37 | 'path' => '/{pk}/update', |
||
38 | 'defaults' => array(), |
||
39 | 'requirements' => array(), |
||
40 | 'methods' => array('POST'), |
||
41 | 'controller' => 'edit', |
||
42 | ), |
||
43 | 'show' => array( |
||
44 | 'path' => '/{pk}/show', |
||
45 | 'defaults' => array(), |
||
46 | 'requirements' => array(), |
||
47 | 'methods' => array('GET'), |
||
48 | ), |
||
49 | 'object' => array( |
||
50 | 'path' => '/{pk}/{action}', |
||
51 | 'defaults' => array(), |
||
52 | 'requirements' => array(), |
||
53 | 'methods' => array('GET', 'POST'), |
||
54 | 'controller' => 'actions', |
||
55 | ), |
||
56 | 'batch' => array( |
||
57 | 'path' => '/batch', |
||
58 | 'defaults' => array(), |
||
59 | 'requirements' => array(), |
||
60 | 'methods' => array('POST'), |
||
61 | 'controller' => 'actions', |
||
62 | ), |
||
63 | 'new' => array( |
||
64 | 'path' => '/new', |
||
65 | 'defaults' => array(), |
||
66 | 'requirements' => array(), |
||
67 | 'methods' => array('GET'), |
||
68 | ), |
||
69 | 'create' => array( |
||
70 | 'path' => '/create', |
||
71 | 'defaults' => array(), |
||
72 | 'requirements' => array(), |
||
73 | 'methods' => array('POST'), |
||
74 | 'controller' => 'new', |
||
75 | ), |
||
76 | 'filters' => array( |
||
77 | 'path' => '/filter', |
||
78 | 'defaults' => array(), |
||
79 | 'requirements' => array(), |
||
80 | 'methods' => array('POST', 'GET'), |
||
81 | 'controller' => 'list', |
||
82 | ), |
||
83 | 'scopes' => array( |
||
84 | 'path' => '/scope/{group}/{scope}', |
||
85 | 'defaults' => array(), |
||
86 | 'requirements' => array(), |
||
87 | 'methods' => array('POST', 'GET'), |
||
88 | 'controller' => 'list', |
||
89 | ), |
||
90 | ); |
||
91 | |||
92 | /** |
||
93 | * @var array |
||
94 | */ |
||
95 | protected $yaml = array(); |
||
96 | |||
97 | public function load($resource, $type = null) |
||
98 | { |
||
99 | $collection = new RouteCollection(); |
||
100 | |||
101 | $resource = str_replace('\\', '/', $resource); |
||
102 | $this->yaml = Yaml::parse(file_get_contents($this->getGeneratorFilePath($resource))); |
||
103 | |||
104 | $namespace = $this->getNamespaceFromResource($resource); |
||
105 | $bundle_name = $this->getBundleNameFromResource($resource); |
||
106 | |||
107 | foreach ($this->actions as $controller => $datas) { |
||
108 | $action = 'index'; |
||
109 | |||
110 | $loweredNamespace = str_replace(array('/', '\\'), '_', $namespace); |
||
111 | if ($controller_folder = $this->getControllerFolder($resource)) { |
||
112 | $route_name = $loweredNamespace . '_' . $bundle_name . '_' . $controller_folder . '_' . $controller; |
||
113 | } else { |
||
114 | $route_name = $loweredNamespace . '_' . $bundle_name . '_' . $controller; |
||
115 | } |
||
116 | |||
117 | if (in_array($controller, array('edit', 'update', 'object', 'show')) && |
||
118 | null !== $pk_requirement = $this->getFromYaml('params.pk_requirement', null)) { |
||
119 | $datas['requirements'] = array_merge( |
||
120 | $datas['requirements'], |
||
121 | array('pk' => $pk_requirement) |
||
122 | ); |
||
123 | } |
||
124 | |||
125 | if (isset($datas['controller'])) { |
||
126 | $action = $controller; |
||
127 | $controller = $datas['controller']; |
||
128 | } |
||
129 | |||
130 | $controllerName = $resource.ucfirst($controller).'Controller.php'; |
||
131 | if (!is_file($controllerName)) { |
||
132 | // TODO: what does it mean if controller is not a file?? |
||
133 | continue; |
||
134 | } |
||
135 | |||
136 | if ($controller_folder) { |
||
137 | $datas['defaults']['_controller'] = $namespace . '\\' |
||
138 | . $bundle_name . '\\Controller\\' |
||
139 | . $controller_folder . '\\' |
||
140 | . ucfirst($controller) . 'Controller::' |
||
141 | . $action . 'Action'; |
||
142 | } else { |
||
143 | $datas['defaults']['_controller'] = $loweredNamespace |
||
144 | . $bundle_name . ':' |
||
145 | . ucfirst($controller) . ':' . $action; |
||
146 | } |
||
147 | |||
148 | $route = new Route($datas['path'], $datas['defaults'], $datas['requirements']); |
||
149 | $route->setMethods($datas['methods']); |
||
150 | |||
151 | $route_name = ltrim($route_name, '_'); // fix routes in AppBundle without vendor |
||
152 | |||
153 | $collection->add($route_name, $route); |
||
154 | $collection->addResource(new FileResource($controllerName)); |
||
155 | } |
||
156 | |||
157 | return $collection; |
||
158 | } |
||
159 | |||
160 | public function supports($resource, $type = null) |
||
161 | { |
||
162 | return 'admingenerator' == $type; |
||
163 | } |
||
164 | |||
165 | /** |
||
166 | * @return string |
||
167 | */ |
||
168 | protected function getControllerFolder($resource) |
||
169 | { |
||
170 | preg_match('#.+/.+Bundle/Controller?/(.*?)/?$#', $resource, $matches); |
||
171 | |||
172 | return $matches[1]; |
||
173 | } |
||
174 | |||
175 | /** |
||
176 | * @return string |
||
177 | */ |
||
178 | protected function getBundleNameFromResource($resource) |
||
179 | { |
||
180 | preg_match('#.+/(.+Bundle)/Controller?/(.*?)/?$#', $resource, $matches); |
||
181 | |||
182 | return $matches[1]; |
||
183 | } |
||
184 | |||
185 | protected function getNamespaceFromResource($resource) |
||
186 | { |
||
187 | $finder = Finder::create() |
||
188 | ->name('*Bundle.php') |
||
189 | ->depth(0) |
||
190 | ->in(realpath($resource.'/../../')) // ressource is controller folder |
||
191 | ->getIterator(); |
||
192 | |||
193 | foreach ($finder as $file) { |
||
194 | preg_match('/namespace (.+);/', file_get_contents($file->getRealPath()), $matches); |
||
195 | |||
196 | return implode('\\', explode('\\', $matches[1], -1)); // Remove the short bundle name |
||
197 | } |
||
198 | |||
199 | throw new \Exception(sprintf('Bundle file not found in %s.', realpath($resource.'/../../'))); |
||
200 | } |
||
201 | |||
202 | /** |
||
203 | * @return string |
||
204 | */ |
||
205 | protected function getGeneratorFilePath($resource) |
||
206 | { |
||
207 | // TODO: use the GeneratorsFinder |
||
208 | // Find the *-generator.yml |
||
209 | $finder = Finder::create() |
||
210 | ->name($this->getControllerFolder($resource).'-generator.yml') |
||
211 | ->in(realpath($resource.'/../../Resources/config/')) |
||
212 | ->getIterator(); |
||
213 | |||
214 | foreach ($finder as $file) { |
||
215 | return $file->getRealPath(); |
||
216 | } |
||
217 | |||
218 | throw new \Exception(sprintf( |
||
219 | 'Generator file for %s not found in %s', |
||
220 | $this->getControllerFolder($resource), |
||
221 | realpath($resource.'/../../Resources/config/') |
||
222 | )); |
||
223 | } |
||
224 | |||
225 | /** |
||
226 | * @param string $yaml_path string with point for levels |
||
227 | */ |
||
228 | View Code Duplication | protected function getFromYaml($yaml_path, $default = null) |
|
0 ignored issues
–
show
|
|||
229 | { |
||
230 | $search_in = $this->yaml; |
||
231 | $yaml_path = explode('.', $yaml_path); |
||
232 | foreach ($yaml_path as $key) { |
||
233 | if (!isset($search_in[$key])) { |
||
234 | return $default; |
||
235 | } |
||
236 | $search_in = $search_in[$key]; |
||
237 | } |
||
238 | |||
239 | return $search_in; |
||
240 | } |
||
241 | } |
||
242 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.