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 AOE\Languagevisibility; |
||
4 | |||
5 | /*************************************************************** |
||
6 | * Copyright notice |
||
7 | * |
||
8 | * (c) 2016 AOE GmbH <[email protected]> |
||
9 | * All rights reserved |
||
10 | * |
||
11 | * This script is part of the TYPO3 project. The TYPO3 project is |
||
12 | * free software; you can redistribute it and/or modify |
||
13 | * it under the terms of the GNU General Public License as published by |
||
14 | * the Free Software Foundation; either version 2 of the License, or |
||
15 | * (at your option) any later version. |
||
16 | * |
||
17 | * The GNU General Public License can be found at |
||
18 | * http://www.gnu.org/copyleft/gpl.html. |
||
19 | * |
||
20 | * This script is distributed in the hope that it will be useful, |
||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
23 | * GNU General Public License for more details. |
||
24 | * |
||
25 | * This copyright notice MUST APPEAR in all copies of the script! |
||
26 | ***************************************************************/ |
||
27 | |||
28 | use AOE\Languagevisibility\Services\BeServices; |
||
29 | use TYPO3\CMS\Core\Utility\GeneralUtility; |
||
30 | |||
31 | /** |
||
32 | * Class FieldVisibility |
||
33 | * @package AOE\Languagevisibility |
||
34 | */ |
||
35 | class FieldVisibility { |
||
36 | private $isNewElement = FALSE; |
||
37 | private $pageId = 0; |
||
38 | private $modTSconfig = array(); |
||
39 | private $calcPerms = FALSE; |
||
40 | |||
41 | /** |
||
42 | * @return void |
||
43 | */ |
||
44 | public function init() { |
||
45 | $this->calcPerms = $GLOBALS['BE_USER']->calcPerms($pageInfoArr); |
||
0 ignored issues
–
show
|
|||
46 | } |
||
47 | |||
48 | /** |
||
49 | * @param $PA |
||
50 | * @param $fobj |
||
51 | * @return string |
||
52 | */ |
||
53 | public function user_fieldvisibility($PA) { |
||
54 | $content = ''; |
||
55 | $this->init(); |
||
56 | |||
57 | //init some class attributes |
||
58 | $this->pageId = $PA['row']['pid']; |
||
59 | $uid = $PA['row']['uid']; |
||
60 | |||
61 | if (substr($uid, 0, 3) == 'NEW') { |
||
62 | $this->isNewElement = TRUE; |
||
63 | } |
||
64 | if ($PA['table'] == 'pages' && ! $this->isNewElement) { |
||
65 | $this->pageId = $PA['row']['uid']; |
||
66 | } |
||
67 | |||
68 | $_modTSconfig = $GLOBALS['BE_USER']->getTSConfig('mod.languagevisibility', \TYPO3\CMS\Backend\Utility\BackendUtility::getPagesTSconfig($this->pageId)); |
||
69 | $this->modTSconfig = $_modTSconfig['properties']; |
||
70 | |||
71 | $languageRep = GeneralUtility::makeInstance('AOE\\Languagevisibility\\LanguageRepository'); |
||
72 | $dao = GeneralUtility::makeInstance('AOE\\Languagevisibility\\Dao\DaoCommon'); |
||
73 | |||
74 | $elementfactory = GeneralUtility::makeInstance('AOE\\Languagevisibility\\ElementFactory', $dao); |
||
75 | |||
76 | $value = $PA['row'][$PA['field']]; |
||
77 | $table = $PA['table']; |
||
78 | $isOverlay = BeServices::isOverlayRecord($PA['row'], $table); |
||
79 | |||
80 | $visivilitySetting = @unserialize($value); |
||
81 | if (! is_array($visivilitySetting) && $value != '') { |
||
82 | $content .= 'Visibility Settings seems to be corrupt:' . $value; |
||
83 | } |
||
84 | |||
85 | if ($isOverlay) { |
||
86 | $uid = BeServices::getOriginalUidOfTranslation($PA['row'], $table); |
||
87 | $table = BeServices::getOriginalTableOfTranslation($table); |
||
88 | |||
89 | //This element is an overlay therefore we need to render the visibility field just for the language of the overlay |
||
90 | $overlayRecordsLanguage = $languageRep->getLanguageById($PA['row']['sys_language_uid']); |
||
91 | |||
92 | try { |
||
93 | $originalElement = $elementfactory->getElementForTable($table, $uid); |
||
94 | } catch ( \Exception $e ) { |
||
95 | return ''; |
||
96 | } |
||
97 | |||
98 | $infosStruct = $this->_getLanguageInfoStructurListForElementAndLanguageList($originalElement, array($overlayRecordsLanguage ), $PA['itemFormElName'], TRUE); |
||
99 | } else { |
||
100 | //This element is an original element (no overlay) |
||
101 | try { |
||
102 | $originalElement = $elementfactory->getElementForTable($table, $uid); |
||
103 | } catch ( \Exception $e ) { |
||
104 | return 'sorry this element supports no visibility settings'; |
||
105 | } |
||
106 | |||
107 | $content .= $originalElement->getInformativeDescription(); |
||
108 | |||
109 | if ($originalElement->isMonolithicTranslated()) { |
||
110 | return $content; |
||
111 | } |
||
112 | |||
113 | $languageList = $languageRep->getLanguages(); |
||
114 | $infosStruct = $this->_getLanguageInfoStructurListForElementAndLanguageList($originalElement, $languageList, $PA['itemFormElName'], FALSE); |
||
115 | } |
||
116 | |||
117 | $content .= $this->renderLanguageInfos($infosStruct); |
||
118 | return '<div id="fieldvisibility">' . $content . '<a href="#" onclick="resetSelectboxes()">reset</a></div>' . $this->_javascript(); |
||
119 | } |
||
120 | |||
121 | /** |
||
122 | * This methid is used to generate an infostructur array, which will be |
||
123 | * renderd as a Form |
||
124 | * |
||
125 | * @param tx_languagevisibility_element $changeableElement |
||
126 | * @param array $languageList |
||
127 | * @param string $itemFormElName |
||
128 | * @param boolean $isOverlay |
||
129 | * @return unknown |
||
130 | */ |
||
131 | public function _getLanguageInfoStructurListForElementAndLanguageList($changeableElement, $languageList, $itemFormElName, $isOverlay) { |
||
132 | |||
133 | $visibility = GeneralUtility::makeInstance('AOE\\Languagevisibility\\Services\\VisibilityService'); |
||
134 | $visibilityString = ''; |
||
135 | $infosStruct = array(); |
||
136 | |||
137 | foreach ( $languageList as $language ) { |
||
138 | |||
139 | $infoitem = array('visible' => $visibility->isVisible($language, $changeableElement), 'languageTitle' => $language->getTitle($this->pageId), 'languageFlag' => $language->getFlagImg($this->pageId), 'hasTranslation' => $changeableElement->hasTranslation($language->getUid()), 'isTranslation' => $isOverlay, 'isVisible' => $visibility->isVisible($language, $changeableElement), 'visibilityDescription' => $visibility->getVisibilityDescription($language, $changeableElement) ); |
||
140 | |||
141 | // if there is no access to language - and localsettings exist, then do not show select box |
||
142 | // this is to not be able as an translator to override languagesetting |
||
143 | $currentSetting = $changeableElement->getLocalVisibilitySetting($language->getUid()); |
||
144 | $currentOptionsForUserAndLanguage = BeServices::getAvailableOptionsForLanguage($language, $isOverlay, $changeableElement); |
||
145 | if ($currentSetting == '' || isset($currentOptionsForUserAndLanguage[$currentSetting])) { |
||
146 | |||
147 | if ($isOverlay) { |
||
148 | $defaultSelect = $changeableElement->getVisibilitySettingStoredInOverlayRecord($language->getUid()); |
||
149 | |||
150 | $visibilityValue = $changeableElement->getVisibilitySettingStoredInDefaultRecord($language->getUid()); |
||
151 | $visibilityString = $currentOptionsForUserAndLanguage[$visibilityValue]; |
||
152 | } else { |
||
153 | $defaultSelect = $changeableElement->getVisibilitySettingStoredInDefaultRecord($language->getUid()); |
||
154 | |||
155 | $visibilityValue = $changeableElement->getVisibilitySettingStoredInOverlayRecord($language->getUid()); |
||
156 | $visibilityString = $currentOptionsForUserAndLanguage[$visibilityValue]; |
||
157 | } |
||
158 | |||
159 | if ($this->isNewElement && $defaultSelect == '') { |
||
160 | if ($this->modTSconfig['language.'][$language->getUid() . '.']['defaultVisibilityOnCreate'] != '') { |
||
161 | $defaultSelect = $this->modTSconfig['language.'][$language->getUid() . '.']['defaultVisibilityOnCreate']; |
||
162 | } |
||
163 | } |
||
164 | $selectBox = $this->getSelectBox($language->getUid(), $currentOptionsForUserAndLanguage, $defaultSelect, $itemFormElName); |
||
165 | } else { |
||
166 | $selectBox = '<input type="hidden" name="' . $itemFormElName . '[' . $language->getUid() . ']" value="' . $currentSetting . '" ></input>(' . $currentSetting . ')'; |
||
167 | } |
||
168 | |||
169 | if ($isOverlay) { |
||
170 | $infoitem['overlayVisibility'] = $selectBox; |
||
171 | $infoitem['originalVisibility'] = $visibilityString; |
||
172 | } else { |
||
173 | $infoitem['overlayVisibility'] = $visibilityString; |
||
174 | $infoitem['originalVisibility'] = $selectBox; |
||
175 | } |
||
176 | |||
177 | $infosStruct[] = $infoitem; |
||
178 | } |
||
179 | |||
180 | return $infosStruct; |
||
181 | } |
||
182 | |||
183 | /** |
||
184 | * Generates the selectbox for the languagevisibility settings of an item |
||
185 | * |
||
186 | * @param int $languageid |
||
187 | * @param array $select |
||
188 | * @param string $current current selected item |
||
189 | * @param string $name |
||
190 | * @return string |
||
191 | */ |
||
192 | protected function getSelectBox($languageid, $select, $current, $name) { |
||
193 | $content = ''; |
||
194 | $addClassName = ''; |
||
195 | if (count($select) == 1) { |
||
196 | $addClassName = ' oneitem'; |
||
197 | } |
||
198 | |||
199 | $content .= '<select class="fieldvisibility_selects' . $addClassName . '" name="' . $name . '[' . $languageid . ']">'; |
||
200 | foreach ( $select as $skey => $svalue ) { |
||
201 | if ($current == $skey) { |
||
202 | $selected = ' selected="selected"'; |
||
203 | } else { |
||
204 | $selected = ''; |
||
205 | } |
||
206 | $content .= '<option class="' . $this->getCSSClassFromVisibilityKey($skey) . '" value="' . $skey . '"' . $selected . '>' . $svalue . '</option>'; |
||
207 | } |
||
208 | $content .= '</select>'; |
||
209 | return $content; |
||
210 | |||
211 | } |
||
212 | |||
213 | /** |
||
214 | * This method is used to determine a css class for the diffrent visiblity modes |
||
215 | * |
||
216 | * @param string |
||
217 | * @return string |
||
218 | */ |
||
219 | protected function getCSSClassFromVisibilityKey($key) { |
||
220 | $res = ''; |
||
221 | switch ($key) { |
||
222 | case 'yes' : |
||
223 | case 'no' : |
||
224 | case 't' : |
||
225 | case 'f' : |
||
226 | $res = $key; |
||
227 | break; |
||
228 | case 'no+' : |
||
229 | $res = 'no_inherited'; |
||
230 | break; |
||
231 | } |
||
232 | |||
233 | return $res; |
||
234 | } |
||
235 | |||
236 | protected function renderLanguageInfos($infosStruct) { |
||
237 | $content = '<style type="text/css"> |
||
238 | .visibilitytable {margin: 10px 0 0 0} |
||
239 | .visibilitytable .bgColor4 {background-color: #C9B88B} |
||
240 | .visibilitytable .bgColor {background-color: #FFEED4} |
||
241 | .visibilitytable .lastcell {background-color: #DEEAB5} |
||
242 | .visibilitytable .bgColor .lastcell {background-color: #E8EAB5} |
||
243 | .visibilitytable .bgColor4 .lastcell {border-bottom: 1px solid #333333; background-color: #C9B88B} |
||
244 | .visibilitytable th {padding: 2px 5px 2px 2px; text-align: left; font-size: 12px;} |
||
245 | .visibilitytable select {width: 100px} |
||
246 | .visibilitytable select.oneitem {background-color: #999999} |
||
247 | .visibilitytable select option {background-color: #83FF73} |
||
248 | .visibilitytable select .yes {background-color: #E0FF81} |
||
249 | .visibilitytable select .no {background-color: #FFCE81} |
||
250 | .visibilitytable select .no_inherited {background-color: #FF8881} |
||
251 | .visibilitytable select .t {background-color: #BFFFB7} |
||
252 | .visibilitytable select .f {background-color: #BFFFB7} |
||
253 | .visibilitytable td {padding: 0 5px 2px 2px} |
||
254 | </' . 'style>'; |
||
255 | |||
256 | $content .= '<table style="border-collapse: collapse;" class="visibilitytable">'; |
||
257 | $content .= '<tr class="bgColor4">' . '<th >' . $this->getLLL('language') . '</th>' . '<th >' . $this->getLLL('visibility_in_default') . '</th>' . '<th >' . $this->getLLL('visibility_in_overlay') . '</th>' . '<th>' . $this->getLLL('hastranslation') . '</th>' . '<th>' . $this->getLLL('isshown') . '</th>' . '</tr>'; |
||
258 | |||
259 | $i=0; |
||
260 | foreach ( $infosStruct as $info ) { |
||
261 | $i ++; |
||
262 | |||
263 | // toggle row class |
||
264 | $class = ($i % 2) ? ' class="bgColor"' : ''; |
||
265 | $content .= '<tr' . $class . '>' . '<td>' . $info['languageFlag'] . $info['languageTitle'] . '</td>' . '<td>' . $info['originalVisibility'] . '</td>' . '<td>' . $info['overlayVisibility'] . '</td>' . '<td style="text-align: center">' . $this->_getStatusImage($info['hasTranslation'] || $info['isTranslation'], '') . '</td>' . '<td style="text-align: center" class="lastcell">' . $this->_getStatusImage($info['isVisible'], $info['visibilityDescription']) . '</td>' . '</tr>'; |
||
266 | } |
||
267 | |||
268 | $content .= '</table>'; |
||
269 | return $content; |
||
270 | } |
||
271 | |||
272 | /** |
||
273 | * @param $key |
||
274 | * @return mixed |
||
275 | */ |
||
276 | public function getLLL($key) { |
||
277 | return $GLOBALS['LANG']->sl('LLL:EXT:languagevisibility/locallang_db.xml:' . $key); |
||
278 | } |
||
279 | |||
280 | /** |
||
281 | * Generated a little status icon |
||
282 | * |
||
283 | * @param boolean positive or negative state |
||
284 | * @param string $title |
||
285 | * @return html tag to include the state image |
||
286 | */ |
||
287 | protected function _getStatusImage($stat, $title = '') { |
||
288 | if ($stat) { |
||
289 | return '<img src="../typo3conf/ext/languagevisibility/Resources/Public/Icons/ok.gif" title="' . htmlspecialchars($title) . '">'; |
||
290 | } else { |
||
291 | return '<img src="../typo3conf/ext/languagevisibility/Resources/Public/Icons/nok.gif" title="' . htmlspecialchars($title) . '">'; |
||
292 | } |
||
293 | } |
||
294 | |||
295 | protected function _link_edit($table, $id) { |
||
296 | $params = '&table=' . $table . '&edit[' . $table . '][' . $id . ']=edit'; |
||
297 | $url = $GLOBALS['BACK_PATH'] . 'alt_doc.php?id=' . $id . $params; |
||
298 | return '<a href="' . $url . '" target="blank">[edit]</a>'; |
||
299 | } |
||
300 | |||
301 | /******************************************* |
||
302 | * |
||
303 | * Link functions (protected) |
||
304 | * |
||
305 | *******************************************/ |
||
306 | |||
307 | /** |
||
308 | * Returns an HTML link for editing |
||
309 | * |
||
310 | * @param string $label The label (or image) |
||
311 | * @param string $table The table, fx. 'tt_content' |
||
312 | * @param integer $uid The uid of the element to be edited |
||
313 | * @param boolean $forced By default the link is not shown if translatorMode is set, but with this boolean it can be forced anyway. |
||
314 | * @return string HTML anchor tag containing the label and the correct link |
||
315 | * @access protected |
||
316 | */ |
||
317 | public function link_edit($label, $table, $uid, $forced = FALSE) { |
||
0 ignored issues
–
show
|
|||
318 | if ($label) { |
||
319 | if (($table == 'pages' && ($this->calcPerms & 2) || $table != 'pages' && ($this->calcPerms & 16))) { |
||
320 | |||
321 | $params = '&edit[' . $table . '][' . $uid . ']=edit'; |
||
322 | $retUrl = 'returnUrl=' . ($requestUri == - 1 ? "'+T3_THIS_LOCATION+'" : rawurlencode($requestUri ? $requestUri : \TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('REQUEST_URI'))); |
||
0 ignored issues
–
show
|
|||
323 | $url = "alt_doc.php?" . $retUrl . $params; |
||
324 | $onClick = "window.open('" . $url . "','editpopup','scrollbars=no,status=no,toolbar=no,location=no,directories=no,resizable=no,menubar=no,width=700,height=500,top=10,left=10')"; |
||
325 | return '<a style="text-decoration: none;" href="#" onclick="' . htmlspecialchars($onClick) . '">' . $label . '</a>'; |
||
326 | |||
327 | } else { |
||
328 | return $label; |
||
329 | } |
||
330 | } |
||
331 | return ''; |
||
332 | } |
||
333 | |||
334 | /** |
||
335 | * @return string |
||
336 | */ |
||
337 | protected function _javascript() { |
||
338 | |||
339 | return ' |
||
340 | <script type="text/javascript"> |
||
341 | |||
342 | function resetSelectboxes() { |
||
343 | var obj=getElementsByClassName("fieldvisibility_selects"); |
||
344 | for(i=0;i<obj.length;i++) |
||
345 | { |
||
346 | obj[i].selectedIndex=0; |
||
347 | } |
||
348 | } |
||
349 | |||
350 | function getElementsByClassName(class_name) |
||
351 | { |
||
352 | var all_obj,ret_obj=new Array(),j=0,teststr; |
||
353 | |||
354 | if(document.all)all_obj=document.all; |
||
355 | else if(document.getElementsByTagName && !document.all) |
||
356 | all_obj=document.getElementsByTagName("*"); |
||
357 | |||
358 | for(i=0;i<all_obj.length;i++) |
||
359 | { |
||
360 | if(all_obj[i].className.indexOf(class_name)!=-1) |
||
361 | { |
||
362 | teststr=","+all_obj[i].className.split(" ").join(",")+","; |
||
363 | if(teststr.indexOf(","+class_name+",")!=-1) |
||
364 | { |
||
365 | ret_obj[j]=all_obj[i]; |
||
366 | j++; |
||
367 | } |
||
368 | } |
||
369 | } |
||
370 | return ret_obj; |
||
371 | } |
||
372 | |||
373 | </script>'; |
||
374 | } |
||
375 | } |
||
376 |
This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.