These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * DokuWiki Syntax Plugin Backlinks. |
||
4 | * |
||
5 | * Shows a list of pages that link back to a given page. |
||
6 | * |
||
7 | * Syntax: {{backlinks>[pagename][#filterNS|!#filterNS]}} |
||
8 | * |
||
9 | * [pagename] - a valid wiki pagename or a . for the current page |
||
10 | * [filterNS] - a valid,absolute namespace name, optionally prepended with ! to exclude |
||
11 | * |
||
12 | * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) |
||
13 | * @author Michael Klier <[email protected]> |
||
14 | * @author Mark C. Prins <[email protected]> |
||
15 | */ |
||
16 | if (!defined('DOKU_INC')) die(); |
||
17 | |||
18 | if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); |
||
19 | if (!defined('DW_LF')) define('DW_LF', "\n"); |
||
20 | |||
21 | require_once(DOKU_PLUGIN.'syntax.php'); |
||
22 | require_once(DOKU_INC.'inc/parserutils.php'); |
||
23 | |||
24 | /** |
||
25 | * All DokuWiki plugins to extend the parser/rendering mechanism |
||
26 | * need to inherit from this class |
||
27 | */ |
||
28 | class syntax_plugin_backlinks extends DokuWiki_Syntax_Plugin { |
||
29 | /** |
||
30 | * Syntax Type. |
||
31 | * |
||
32 | * Needs to return one of the mode types defined in $PARSER_MODES in parser.php |
||
33 | * @see DokuWiki_Syntax_Plugin::getType() |
||
34 | */ |
||
35 | function getType() { return 'substition'; } |
||
0 ignored issues
–
show
|
|||
36 | |||
37 | /** |
||
38 | * @see DokuWiki_Syntax_Plugin::getPType() |
||
39 | */ |
||
40 | function getPType() { return 'block'; } |
||
0 ignored issues
–
show
|
|||
41 | |||
42 | /** |
||
43 | * @see Doku_Parser_Mode::getSort() |
||
44 | */ |
||
45 | function getSort() { return 304; } |
||
0 ignored issues
–
show
|
|||
46 | |||
47 | /** |
||
48 | * Connect pattern to lexer. |
||
49 | * @see Doku_Parser_Mode::connectTo() |
||
50 | */ |
||
51 | function connectTo($mode) { |
||
0 ignored issues
–
show
|
|||
52 | $this->Lexer->addSpecialPattern('\{\{backlinks>.+?\}\}', $mode, 'plugin_backlinks'); |
||
53 | } |
||
54 | |||
55 | /** |
||
56 | * Handler to prepare matched data for the rendering process. |
||
57 | * @see DokuWiki_Syntax_Plugin::handle() |
||
58 | */ |
||
59 | function handle($match, $state, $pos, Doku_Handler $handler){ |
||
0 ignored issues
–
show
|
|||
60 | |||
61 | // Take the id of the source |
||
62 | // It can be a rendering of a sidebar |
||
63 | global $INFO; |
||
64 | global $ID; |
||
65 | $id = $ID; |
||
66 | // If it's a sidebar, get the original id. |
||
67 | if ($INFO != null) { |
||
68 | $id = $INFO['id']; |
||
69 | } |
||
70 | |||
71 | // strip {{backlinks> from start and }} from end |
||
72 | $match = substr($match,12,-2); |
||
73 | |||
74 | if(strstr($match, "#")){ |
||
75 | $includeNS = substr(strstr($match, "#", FALSE), 1); |
||
76 | $match= strstr($match, "#", TRUE); |
||
77 | } |
||
78 | |||
79 | $match = ($match == '.') ? $id : $match; |
||
80 | |||
81 | if(strstr($match,".:")) { |
||
82 | resolve_pageid(getNS($id),$match,$exists); |
||
0 ignored issues
–
show
|
|||
83 | } |
||
84 | |||
85 | return (array($match, $includeNS)); |
||
0 ignored issues
–
show
The variable
$includeNS does not seem to be defined for all execution paths leading up to this point.
If you define a variable conditionally, it can happen that it is not defined for all execution paths. Let’s take a look at an example: function myFunction($a) {
switch ($a) {
case 'foo':
$x = 1;
break;
case 'bar':
$x = 2;
break;
}
// $x is potentially undefined here.
echo $x;
}
In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined. Available Fixes
![]() |
|||
86 | } |
||
87 | |||
88 | /** |
||
89 | * Handles the actual output creation. |
||
90 | * @see DokuWiki_Syntax_Plugin::render() |
||
91 | */ |
||
92 | function render($mode, Doku_Renderer $renderer, $data) { |
||
0 ignored issues
–
show
|
|||
93 | global $lang; |
||
94 | |||
95 | if($mode == 'xhtml'){ |
||
96 | $renderer->info['cache'] = false; |
||
97 | |||
98 | @require_once(DOKU_INC.'inc/fulltext.php'); |
||
0 ignored issues
–
show
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.
If you suppress an error, we recommend checking for the error condition explicitly: // For example instead of
@mkdir($dir);
// Better use
if (@mkdir($dir) === false) {
throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
![]() |
|||
99 | $backlinks = ft_backlinks($data[0]); |
||
100 | |||
101 | dbglog($backlinks, "backlinks: all backlinks to: $data[0]"); |
||
102 | |||
103 | $renderer->doc .= '<div id="plugin__backlinks">' . DW_LF; |
||
104 | |||
105 | $filterNS = $data[1]; |
||
106 | if(!empty($backlinks) && !empty($filterNS)) { |
||
107 | if (stripos($filterNS, "!", 0) === 0) { |
||
108 | $filterNS = substr($filterNS, 1); |
||
109 | dbglog($filterNS, "backlinks: exluding all of namespace: $filterNS"); |
||
110 | $backlinks= array_filter($backlinks, function($ns) use($filterNS) { |
||
111 | return stripos($ns, $filterNS, 0) !== 0; |
||
112 | }); |
||
113 | } else { |
||
114 | dbglog($filterNS, "backlinks: including namespace: $filterNS only"); |
||
115 | $backlinks= array_filter($backlinks, function($ns) use($filterNS) { |
||
116 | return stripos($ns, $filterNS, 0) === 0; |
||
117 | }); |
||
118 | } |
||
119 | } |
||
120 | |||
121 | dbglog($backlinks, "backlinks: all backlinks to be rendered"); |
||
122 | |||
123 | if(!empty($backlinks)) { |
||
124 | |||
125 | $renderer->doc .= '<ul class="idx">'; |
||
126 | |||
127 | foreach($backlinks as $backlink){ |
||
128 | $name = p_get_metadata($backlink, 'title'); |
||
129 | if(empty($name)) $name = $backlink; |
||
130 | $renderer->doc .= '<li><div class="li">'; |
||
131 | $renderer->doc .= html_wikilink(':'.$backlink, $name); |
||
132 | $renderer->doc .= '</div></li>' . DW_LF; |
||
133 | } |
||
134 | |||
135 | $renderer->doc .= '</ul>' . DW_LF; |
||
136 | } else { |
||
137 | $renderer->doc .= "<strong>Plugin Backlinks: " . $lang['nothingfound'] . "</strong>" . DW_LF; |
||
138 | } |
||
139 | |||
140 | $renderer->doc .= '</div>' . DW_LF; |
||
141 | |||
142 | return true; |
||
143 | } |
||
144 | return false; |
||
145 | } |
||
146 | } |
||
147 |
Adding explicit visibility (
private
,protected
, orpublic
) is generally recommend to communicate to other developers how, and from where this method is intended to be used.