1 | <?php |
||||
2 | /* |
||||
3 | * LibreNMS |
||||
4 | * |
||||
5 | * Copyright (c) 2018 Vivia Nguyen-Tran <[email protected]> |
||||
6 | * |
||||
7 | * This program is free software: you can redistribute it and/or modify it |
||||
8 | * under the terms of the GNU General Public License as published by the |
||||
9 | * Free Software Foundation, either version 3 of the License, or (at your |
||||
10 | * option) any later version. Please see LICENSE.txt at the top level of |
||||
11 | * the source code distribution for details. |
||||
12 | */ |
||||
13 | |||||
14 | use LibreNMS\Config; |
||||
0 ignored issues
–
show
|
|||||
15 | |||||
16 | if (Auth::user()->hasGlobalAdmin()) { |
||||
0 ignored issues
–
show
The method
hasGlobalAdmin() does not exist on Illuminate\Contracts\Auth\Authenticatable . It seems like you code against a sub-type of Illuminate\Contracts\Auth\Authenticatable such as Illuminate\Foundation\Auth\User .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
17 | ?> |
||||
18 | <!--Modal for adding or updating an alert transport --> |
||||
19 | <div class="modal fade" id="edit-alert-transport" tabindex="-1" role="dialog" |
||||
20 | aria-labelledby="Edit-transport" aria-hidden="true"> |
||||
21 | <div class="modal-dialog modal-lg"> |
||||
22 | <div class="modal-content"> |
||||
23 | <div class="modal-header"> |
||||
24 | <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> |
||||
25 | <h5 class="modal-title" id="Edit-transport">Alert Transport :: <a target="_blank" href="https://docs.librenms.org/Alerting/">Docs <i class="fa fa-book fa-1x"></i></a> </h5> |
||||
26 | </div> |
||||
27 | <div class="modal-body"> |
||||
28 | <form method="post" role="form" id="transports" class="form-horizontal transports-form"> |
||||
29 | <?php echo csrf_field() ?> |
||||
30 | <input type="hidden" name="transport_id" id="transport_id" value=""> |
||||
31 | <input type="hidden" name="type" id="type" value="alert-transports"> |
||||
32 | <div class='form-group' title="The description of this alert transport."> |
||||
33 | <label for='name' class='col-sm-3 col-md-2 control-label'>Transport name: </label> |
||||
34 | <div class='col-sm-9 col-md-10'> |
||||
35 | <input type='text' id='name' name='name' class='form-control validation' maxlength='200' required> |
||||
36 | </div> |
||||
37 | </div> |
||||
38 | <div class="form-group" title="The type of transport."> |
||||
39 | <label for='transport-choice' class='col-sm-3 col-md-2 control-label'>Transport type: </label> |
||||
40 | <div class="col-sm-3"> |
||||
41 | <select name='transport-choice' id='transport-choice' class='form-control'> |
||||
42 | <?php |
||||
43 | |||||
44 | // Create list of transport |
||||
45 | $transport_dir = Config::get('install_dir') . '/LibreNMS/Alert/Transport'; |
||||
46 | $transports_list = []; |
||||
47 | foreach (scandir($transport_dir) as $transport) { |
||||
48 | $transport = strstr($transport, '.', true); |
||||
49 | if (empty($transport)) { |
||||
50 | continue; |
||||
51 | } |
||||
52 | $transports_list[] = $transport; |
||||
53 | } |
||||
54 | foreach ($transports_list as $transport) { |
||||
55 | echo '<option value="' . strtolower($transport) . '-form">' . $transport . '</option>'; |
||||
56 | } ?> |
||||
57 | </select> |
||||
58 | </div> |
||||
59 | </div> |
||||
60 | <div class="form-group" title="The transport is default."> |
||||
61 | <label for="default" class="col-sm-3 col-md-2 control-label">Default Alert: </label> |
||||
62 | <div class="col-sm-2"> |
||||
63 | <input type="checkbox" name="is_default" id="is_default"> |
||||
64 | </div> |
||||
65 | </div> |
||||
66 | </form> |
||||
67 | <?php |
||||
68 | |||||
69 | $switches = []; // store names of bootstrap switches |
||||
70 | foreach ($transports_list as $transport) { |
||||
71 | $class = 'LibreNMS\\Alert\\Transport\\' . $transport; |
||||
72 | |||||
73 | if (! method_exists($class, 'configTemplate')) { |
||||
74 | // Skip since support has not been added |
||||
75 | continue; |
||||
76 | } |
||||
77 | |||||
78 | echo '<form method="post" role="form" id="' . strtolower($transport) . '-form" class="form-horizontal transport">'; |
||||
79 | echo csrf_field(); |
||||
80 | echo '<input type="hidden" name="transport-type" id="transport-type" value="' . strtolower($transport) . '">'; |
||||
81 | |||||
82 | $tmp = call_user_func($class . '::configTemplate'); |
||||
0 ignored issues
–
show
Are you sure
$class of type object can be used in concatenation ?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
83 | |||||
84 | foreach ($tmp['config'] as $item) { |
||||
85 | if ($item['type'] !== 'hidden') { |
||||
86 | echo '<div class="form-group" title="' . $item['descr'] . '">'; |
||||
87 | echo '<label for="' . $item['name'] . '" class="col-sm-3 col-md-2 control-label">' . $item['title'] . ': </label>'; |
||||
88 | if ($item['type'] == 'text' || $item['type'] == 'password') { |
||||
89 | echo '<div class="col-sm-9 col-md-10">'; |
||||
90 | echo '<input type="' . $item['type'] . '" id="' . $item['name'] . '" name="' . $item['name'] . '" class="form-control" '; |
||||
91 | if ($item['required']) { |
||||
92 | echo 'required>'; |
||||
93 | } else { |
||||
94 | echo '>'; |
||||
95 | } |
||||
96 | echo '</div>'; |
||||
97 | } elseif ($item['type'] == 'checkbox') { |
||||
98 | echo '<div class="col-sm-2">'; |
||||
99 | echo '<input type="checkbox" name="' . $item['name'] . '" id="' . $item['name'] . '">'; |
||||
100 | echo '</div>'; |
||||
101 | $switches[$item['name']] = $item['default']; |
||||
102 | } elseif ($item['type'] == 'select') { |
||||
103 | echo '<div class="col-sm-3">'; |
||||
104 | echo '<select name="' . $item['name'] . '" id="' . $item['name'] . '" class="form-control">'; |
||||
105 | foreach ($item['options'] as $descr => $opt) { |
||||
106 | echo '<option value="' . $opt . '">' . $descr . '</option>'; |
||||
107 | } |
||||
108 | echo '</select>'; |
||||
109 | echo '</div>'; |
||||
110 | } elseif ($item['type'] === 'textarea') { |
||||
111 | echo '<div class="col-sm-9 col-md-10">'; |
||||
112 | echo '<textarea name="' . $item['name'] . '" id="' . $item['name'] . '" class="form-control" placeholder="' . $item['descr'] . '">'; |
||||
113 | echo '</textarea>'; |
||||
114 | echo '</div>'; |
||||
115 | } elseif ($item['type'] === 'oauth') { |
||||
116 | $class = isset($item['class']) ? $item['class'] : 'btn-success'; |
||||
117 | $callback = urlencode(url()->current() . '/?oauthtransport=' . $transport); |
||||
118 | $url = $item['url'] . $callback; |
||||
119 | |||||
120 | echo '<a class="btn btn-oauth ' . $class . '"'; |
||||
121 | echo '" href="' . $url . '" data-base-url="' . $url . '">'; |
||||
122 | if (isset($item['icon'])) { |
||||
123 | echo '<img src="' . asset('images/transports/' . $item['icon']) . '" width="24" height="24"> '; |
||||
124 | } |
||||
125 | echo $item['descr']; |
||||
126 | echo '</a>'; |
||||
127 | } |
||||
128 | echo '</div>'; |
||||
129 | } |
||||
130 | } |
||||
131 | echo '<div class="form-group">'; |
||||
132 | echo '<div class="col-sm-12 text-center">'; |
||||
133 | echo '<button type="button" class="btn btn-success btn-save" name="save-transport">'; |
||||
134 | echo 'Save Transport'; |
||||
135 | echo '</button>'; |
||||
136 | echo '</div>'; |
||||
137 | echo '</div>'; |
||||
138 | echo '</form>'; |
||||
139 | } ?> |
||||
140 | </div> |
||||
141 | </div> |
||||
142 | </div> |
||||
143 | </div> |
||||
144 | <!-- Modal end for adding or updating an alert tramsport--> |
||||
145 | |||||
146 | <!--Modal for deleting an alert transport --> |
||||
147 | <div class="modal fade" id="delete-alert-transport" tabindex="-1" role="dialog" |
||||
148 | aria-labelledby="Delete" aria-hidden="true"> |
||||
149 | <div class="modal-dialog modal-sm"> |
||||
150 | <div class="modal-content"> |
||||
151 | <div class="modal-header"> |
||||
152 | <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> |
||||
153 | <h5 class="modal-title" id="Delete">Confirm Transport Delete</h5> |
||||
154 | </div> |
||||
155 | <div class="modal-body"> |
||||
156 | <p>If you would like to remove this alert transport then please click Delete.</p> |
||||
157 | </div> |
||||
158 | <div class="modal-footer"> |
||||
159 | <form role="form" class="remove_transport_form"> |
||||
160 | <?php echo csrf_field() ?> |
||||
161 | <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> |
||||
162 | <button type="submit" class="btn btn-danger danger" id="remove-alert-transport" data-target="remove-alert-transport">Delete</button> |
||||
163 | <input type="hidden" name="transport_id" id="delete_transport_id" value=""> |
||||
164 | <input type="hidden" name="confirm" id="confirm" value="yes"> |
||||
165 | </form> |
||||
166 | </div> |
||||
167 | </div> |
||||
168 | </div> |
||||
169 | </div> |
||||
170 | <!--Modal end for deleting an alert transport --> |
||||
171 | |||||
172 | <script> |
||||
173 | // Scripts related to editing/updating alert transports |
||||
174 | |||||
175 | // Display different form on selection |
||||
176 | $("#transport-choice").on("change", function (){ |
||||
177 | $(".transport").hide(); |
||||
178 | $("#" + $(this).val()).show().find("input:text").val(""); |
||||
179 | |||||
180 | }); |
||||
181 | |||||
182 | $("#edit-alert-transport").on("show.bs.modal", function(e) { |
||||
183 | // Get transport id of clicked element |
||||
184 | var transport_id = $(e.relatedTarget).data("transport_id"); |
||||
185 | $("#transport_id").val(transport_id); |
||||
186 | if(transport_id > 0) { |
||||
187 | $.ajax({ |
||||
188 | type: "POST", |
||||
189 | url: "ajax_form.php", |
||||
190 | data: { type: "show-alert-transport", transport_id: transport_id }, |
||||
191 | success: function (data) { |
||||
192 | loadTransport(data); |
||||
193 | }, |
||||
194 | error: function () { |
||||
195 | toastr.error("Failed to process alert transport"); |
||||
196 | } |
||||
197 | }); |
||||
198 | |||||
199 | } else { |
||||
200 | // Resetting to default |
||||
201 | $("#name").val(""); |
||||
202 | $("#transport-choice").val("mail-form"); |
||||
203 | $(".transport").hide(); |
||||
204 | $("#" + $("#transport-choice").val()).show().find("input:text").val(""); |
||||
205 | $("#is_default").bootstrapSwitch('state', false); |
||||
206 | |||||
207 | // Turn on all switches in form |
||||
208 | var switches = <?php echo json_encode($switches); ?>; |
||||
209 | $.each(switches, function(name, state) { |
||||
210 | $("input[name="+name+"]").bootstrapSwitch('state', state); |
||||
211 | }); |
||||
212 | } |
||||
213 | }); |
||||
214 | |||||
215 | function loadTransport(transport) { |
||||
216 | var form_id = transport.type+"-form"; |
||||
217 | var transport_form = $("#" + form_id); |
||||
218 | |||||
219 | $("#name").val(transport.name); |
||||
220 | $("#transport-choice").val(form_id); |
||||
221 | $("#is_default").bootstrapSwitch('state', transport.is_default); |
||||
222 | $(".transport").hide(); |
||||
223 | transport_form.show().find("input:text").val(""); |
||||
224 | |||||
225 | // Populate the field values |
||||
226 | transport.details.forEach(function(config) { |
||||
227 | var $field = transport_form.find("#" + config.name); |
||||
228 | if ($field.prop('type') == 'checkbox') { |
||||
229 | $field.bootstrapSwitch('state', config.value); |
||||
230 | } else { |
||||
231 | $field.val(config.value); |
||||
232 | } |
||||
233 | }); |
||||
234 | } |
||||
235 | |||||
236 | $(".btn-oauth").on("click", function (e) { |
||||
237 | this.href = $(this).data('base-url') + '%26id=' + $("#transport_id").val(); |
||||
238 | }); |
||||
239 | |||||
240 | // Save alert transport |
||||
241 | $(".btn-save").on("click", function (e) { |
||||
242 | e.preventDefault(); |
||||
243 | |||||
244 | //Combine form data (general and transport specific) |
||||
245 | data = $("form.transports-form").serializeArray(); |
||||
246 | data = data.concat($("#" + $("#transport-choice").val()).serializeArray()); |
||||
247 | |||||
248 | if (data !== null) { |
||||
249 | //post data to ajax form |
||||
250 | $.ajax({ |
||||
251 | type: "POST", |
||||
252 | url: "ajax_form.php", |
||||
253 | data: data, |
||||
254 | dataType: "json", |
||||
255 | success: function (data) { |
||||
256 | if (data.status == 'ok') { |
||||
257 | toastr.success(data.message); |
||||
258 | setTimeout(function (){ |
||||
259 | $("#edit-alert-transports").modal("hide"); |
||||
260 | window.location.reload(); |
||||
261 | }, 500); |
||||
262 | } else { |
||||
263 | toastr.error(data.message); |
||||
264 | } |
||||
265 | }, |
||||
266 | error: function () { |
||||
267 | toastr.error("Failed to process alert transport"); |
||||
268 | } |
||||
269 | }); |
||||
270 | } |
||||
271 | }); |
||||
272 | |||||
273 | // Scripts related to deleting an alert transport |
||||
274 | |||||
275 | // Populate transport id value |
||||
276 | $("#delete-alert-transport").on("show.bs.modal", function(event) { |
||||
277 | transport_id = $(event.relatedTarget).data("transport_id"); |
||||
278 | $("#delete_transport_id").val(transport_id); |
||||
279 | }); |
||||
280 | |||||
281 | // Delete the alert transport |
||||
282 | $("#remove-alert-transport").on("click", function(event) { |
||||
283 | event.preventDefault(); |
||||
284 | var transport_id = $("#delete_transport_id").val(); |
||||
285 | $.ajax({ |
||||
286 | type: "POST", |
||||
287 | url: "ajax_form.php", |
||||
288 | data: { type: "delete-alert-transport", transport_id: transport_id }, |
||||
289 | dataType: "json", |
||||
290 | success: function(data) { |
||||
291 | if (data.status == 'ok') { |
||||
292 | toastr.success(data.message); |
||||
293 | $("#alert-transport-" + transport_id).remove(); |
||||
294 | $("#delete-alert-transport").modal("hide"); |
||||
295 | } else { |
||||
296 | toastr.error(data.message); |
||||
297 | } |
||||
298 | }, |
||||
299 | error: function() { |
||||
300 | toastr.error("The alert transport could not be deleted."); |
||||
301 | } |
||||
302 | }); |
||||
303 | }); |
||||
304 | |||||
305 | </script> |
||||
306 | |||||
307 | <?php |
||||
308 | } |
||||
309 |
Let?s assume that you have a directory layout like this:
and let?s assume the following content of
Bar.php
:If both files
OtherDir/Foo.php
andSomeDir/Foo.php
are loaded in the same runtime, you will see a PHP error such as the following:PHP Fatal error: Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php
However, as
OtherDir/Foo.php
does not necessarily have to be loaded and the error is only triggered if it is loaded beforeOtherDir/Bar.php
, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias: