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 | var bookmarksPage = 0; |
||
2 | var bookmarksLoading = false; |
||
3 | var dialog; |
||
4 | var bookmarksSorting = 'bookmarks_sorting_recent'; |
||
5 | var fullTags = []; |
||
6 | var ajaxCallCount = 0; |
||
7 | |||
8 | $(document).ready(function () { |
||
9 | getTags(); |
||
10 | watchUrlField(); |
||
11 | $('#bm_import').change(attachSettingEvent); |
||
12 | $('#add_url').on('keydown keyup change click', watchUrlField); |
||
13 | $('#app-settings').on('click keydown', toggleSettings); |
||
14 | $('#bm_export').click(exportBm); |
||
15 | $('#emptycontent-setting').click(function () { |
||
16 | if (!$('#app-settings').hasClass('open')) { |
||
17 | $('#app-settings').click(); |
||
18 | } |
||
19 | }); |
||
20 | $('.bookmarks_list').scroll(updateOnBottom).empty(); |
||
21 | $('#tag_filter input').tagit({ |
||
22 | allowSpaces: true, |
||
23 | availableTags: fullTags, |
||
24 | onTagFinishRemoved: filterTagsChanged, |
||
25 | placeholderText: t('bookmarks', 'Filter by tag') |
||
26 | }).tagit('option', 'onTagAdded', filterTagsChanged); |
||
27 | getBookmarks(); |
||
28 | }); |
||
29 | |||
30 | function getTags() { |
||
31 | jQuery.ajax({ |
||
32 | url: 'tag', |
||
33 | success: function (result) { |
||
34 | fullTags = result; |
||
35 | }, |
||
36 | async: false |
||
37 | }); |
||
38 | } |
||
39 | |||
40 | var formatString = (function () { |
||
41 | var replacer = function (context) { |
||
42 | return function (s, name) { |
||
43 | return context[name]; |
||
44 | }; |
||
45 | }; |
||
46 | |||
47 | return function (input, context) { |
||
48 | return input.replace(/\{(\w+)\}/g, replacer(context)); |
||
49 | }; |
||
50 | })(); |
||
51 | |||
52 | function increaseAjaxCallCount() { |
||
53 | ajaxCallCount++; |
||
54 | if (ajaxCallCount - 1 === 0) { |
||
55 | updateLoadingAnimation(); |
||
56 | } |
||
57 | } |
||
58 | |||
59 | function decreaseAjaxCallCount() { |
||
60 | if (ajaxCallCount > 0) { |
||
61 | ajaxCallCount--; |
||
62 | updateLoadingAnimation(); |
||
63 | } |
||
64 | } |
||
65 | |||
66 | function updateLoadingAnimation() { |
||
67 | if (ajaxCallCount === 0) { |
||
68 | $('#bookmark_add_submit').removeClass('icon-loading-small'); |
||
69 | $('#bookmark_add_submit').addClass('icon-add'); |
||
70 | } else { |
||
71 | $('#bookmark_add_submit').removeClass('icon-add'); |
||
72 | $('#bookmark_add_submit').addClass('icon-loading-small'); |
||
73 | } |
||
74 | } |
||
75 | |||
76 | function watchClickInSetting(e) { |
||
77 | if ($('#app-settings').find($(e.target)).length === 0) { |
||
78 | toggleSettings(); |
||
79 | } |
||
80 | } |
||
81 | |||
82 | function checkURL(url) { |
||
83 | if (url.substring(0, 3) === "htt") { |
||
84 | return url; |
||
85 | } |
||
86 | return "http://" + url; |
||
87 | } |
||
88 | |||
89 | function toggleSettings() { |
||
90 | if ($('#app-settings').hasClass('open')) { //Close |
||
91 | $('#app-settings').switchClass("open", ""); |
||
92 | $('body').unbind('click', watchClickInSetting); |
||
93 | } |
||
94 | else { |
||
95 | $('#app-settings').switchClass("", "open"); |
||
96 | $('body').bind('click', watchClickInSetting); |
||
97 | } |
||
98 | } |
||
99 | function addFilterTag(event) { |
||
100 | event.preventDefault(); |
||
101 | $('#tag_filter input').tagit('createTag', $(this).text()); |
||
102 | } |
||
103 | |||
104 | function updateTagsList(tag) { |
||
105 | var html = tmpl("tag_tmpl", tag); |
||
106 | $('.tag_list').append(html); |
||
107 | } |
||
108 | |||
109 | function filterTagsChanged() |
||
110 | { |
||
111 | $('#bookmarkFilterTag').val($('#tag_filter input').val()); |
||
112 | $('.bookmarks_list').empty(); |
||
113 | bookmarksPage = 0; |
||
114 | getBookmarks(); |
||
115 | } |
||
116 | function getBookmarks() { |
||
117 | if (bookmarksLoading) { |
||
118 | //have patience :) |
||
119 | return; |
||
120 | } |
||
121 | increaseAjaxCallCount(); |
||
122 | bookmarksLoading = true; |
||
123 | //Update Rel Tags if first page |
||
124 | if (bookmarksPage === 0) { |
||
125 | |||
126 | $.ajax({ |
||
127 | type: 'GET', |
||
128 | url: 'bookmark', |
||
129 | data: {type: 'rel_tags', tag: $('#bookmarkFilterTag').val(), page: bookmarksPage, sort: bookmarksSorting}, |
||
130 | success: function (tags) { |
||
131 | $('.tag_list').empty(); |
||
132 | for (var i in tags.data) { |
||
133 | updateTagsList(tags.data[i]); |
||
134 | } |
||
135 | $('.tag_list .tag_edit').click(renameTag); |
||
136 | $('.tag_list .tag_delete').click(deleteTag); |
||
137 | $('.tag_list a.tag').click(addFilterTag); |
||
138 | |||
139 | |||
140 | } |
||
141 | }); |
||
142 | } |
||
143 | $.ajax({ |
||
144 | type: 'GET', |
||
145 | url: 'bookmark', |
||
146 | data: {type: 'bookmark', tag: $('#bookmarkFilterTag').val(), page: bookmarksPage, sort: bookmarksSorting}, |
||
147 | complete: function () { |
||
148 | decreaseAjaxCallCount(); |
||
149 | }, |
||
150 | success: function (bookmarks) { |
||
151 | if (bookmarks.data.length) { |
||
152 | bookmarksPage += 1; |
||
153 | } |
||
154 | $('.bookmark_link').unbind('click', recordClick); |
||
155 | $('.bookmark_delete').unbind('click', delBookmark); |
||
156 | $('.bookmark_edit').unbind('click', editBookmark); |
||
157 | |||
158 | for (var i in bookmarks.data) { |
||
159 | updateBookmarksList(bookmarks.data[i]); |
||
160 | } |
||
161 | checkEmpty(); |
||
162 | |||
163 | $('.bookmark_link').click(recordClick); |
||
164 | $('.bookmark_delete').click(delBookmark); |
||
165 | $('.bookmark_edit').click(editBookmark); |
||
166 | |||
167 | bookmarksLoading = false; |
||
168 | if (bookmarks.data.length) { |
||
169 | updateOnBottom(); |
||
170 | } |
||
171 | } |
||
172 | }); |
||
173 | } |
||
174 | |||
175 | function watchUrlField() { |
||
176 | var form = $('#add_form'); |
||
177 | var el = $('#add_url'); |
||
178 | var button = $('#bookmark_add_submit'); |
||
179 | form.unbind('submit'); |
||
180 | if (!acceptUrl(el.val())) { |
||
181 | form.bind('submit', function (e) { |
||
182 | e.preventDefault(); |
||
183 | }); |
||
184 | button.addClass('disabled'); |
||
185 | } |
||
186 | else { |
||
187 | button.removeClass('disabled'); |
||
188 | form.bind('submit', addBookmark); |
||
189 | } |
||
190 | } |
||
191 | |||
192 | function acceptUrl(url) { |
||
193 | return url.replace(/^\s+/g, '').replace(/\s+$/g, '') !== ''; |
||
194 | } |
||
195 | |||
196 | function addBookmark(event) { |
||
197 | event.preventDefault(); |
||
198 | var url = $('#add_url').val(); |
||
199 | //If trim is empty |
||
200 | if (!acceptUrl(url)) { |
||
201 | return; |
||
202 | } |
||
203 | |||
204 | $('#add_url').val(''); |
||
205 | var bookmark = {url: url, description: '', title: '', from_own: 0, added_date: new Date()}; |
||
206 | increaseAjaxCallCount(); |
||
207 | $.ajax({ |
||
208 | type: 'POST', |
||
209 | url: 'bookmark', |
||
210 | data: bookmark, |
||
211 | complete: function () { |
||
212 | decreaseAjaxCallCount(); |
||
213 | }, |
||
214 | success: function (data) { |
||
215 | if (data.status === 'success') { |
||
216 | // First remove old BM if exists |
||
217 | $('.bookmark_single').filterAttr('data-id', data.item.id).remove(); |
||
218 | |||
219 | var bookmark = $.extend({}, bookmark, data.item); |
||
220 | updateBookmarksList(bookmark, 'prepend'); |
||
221 | checkEmpty(); |
||
222 | watchUrlField(); |
||
223 | } |
||
224 | }, |
||
225 | error: function () { |
||
226 | OC.Notification.showTemporary(t('bookmarks', 'Could not add bookmark.')); |
||
227 | } |
||
228 | }); |
||
229 | } |
||
230 | |||
231 | function delBookmark() { |
||
232 | var record = $(this).parent().parent(); |
||
233 | OC.dialogs.confirm(t('bookmarks', 'Are you sure you want to remove this bookmark?'), |
||
234 | t('bookmarks', 'Warning'), function (answer) { |
||
235 | if (answer) { |
||
236 | $.ajax({ |
||
237 | type: 'DELETE', |
||
238 | url: 'bookmark/' + record.data('id'), |
||
239 | success: function (data) { |
||
240 | if (data.status === 'success') { |
||
241 | record.remove(); |
||
242 | checkEmpty(); |
||
243 | } |
||
244 | } |
||
245 | }); |
||
246 | } |
||
247 | }); |
||
248 | } |
||
249 | |||
250 | function checkEmpty() { |
||
251 | if ($('.bookmarks_list').children().length === 0) { |
||
252 | $("#emptycontent").show(); |
||
253 | $("#bm_export").addClass('disabled'); |
||
254 | $('.bookmarks_list').hide(); |
||
255 | } else { |
||
256 | $("#emptycontent").hide(); |
||
257 | $("#bm_export").removeClass('disabled'); |
||
258 | $('.bookmarks_list').show(); |
||
259 | } |
||
260 | } |
||
261 | function editBookmark() { |
||
262 | if ($('.bookmark_single_form').length) { |
||
263 | $('.bookmark_single_form .reset').click(); |
||
264 | } |
||
265 | var record = $(this).parent().parent(); |
||
266 | var bookmark = record.data('record'); |
||
267 | var html = tmpl("item_form_tmpl", bookmark); |
||
268 | |||
269 | record.after(html); |
||
270 | record.hide(); |
||
271 | var rec_form = record.next().find('form'); |
||
272 | rec_form.find('.bookmark_form_tags ul').tagit({ |
||
273 | allowSpaces: true, |
||
274 | availableTags: fullTags, |
||
275 | placeholderText: t('bookmarks', 'Tags') |
||
276 | }); |
||
277 | |||
278 | rec_form.find('.reset').bind('click', cancelBookmark); |
||
279 | rec_form.bind('submit', function (event) { |
||
280 | event.preventDefault(); |
||
281 | var form_values = $(this).serialize(); |
||
282 | $.ajax({ |
||
283 | type: 'PUT', |
||
284 | url: $(this).attr('action') + "/" + this.elements['record_id'].value, |
||
0 ignored issues
–
show
|
|||
285 | data: form_values, |
||
286 | success: function (data) { |
||
287 | if (data.status === 'success') { |
||
288 | //@TODO : do better reaction than reloading the page |
||
289 | filterTagsChanged(); |
||
290 | } else { // On failure |
||
291 | //@TODO : show error message? |
||
292 | } |
||
293 | } |
||
294 | }); |
||
295 | }); |
||
296 | } |
||
297 | |||
298 | function cancelBookmark(event) { |
||
299 | event.preventDefault(); |
||
300 | var rec_form = $(this).closest('form').parent(); |
||
301 | rec_form.prev().show(); |
||
302 | rec_form.remove(); |
||
303 | } |
||
304 | |||
305 | function updateBookmarksList(bookmark, position) { |
||
306 | position = typeof position !== 'undefined' ? position : 'append'; |
||
307 | bookmark = $.extend({title: '', description: '', added_date: new Date('now'), tags: []}, bookmark); |
||
308 | var tags = bookmark.tags; |
||
309 | var taglist = ''; |
||
310 | for (var i = 0, len = tags.length; i < len; ++i) { |
||
311 | if (tags[i] !== '') |
||
312 | taglist = taglist + '<a class="bookmark_tag" href="#">' + escapeHTML(tags[i]) + '</a> '; |
||
313 | } |
||
314 | if (!hasProtocol(bookmark.url)) { |
||
315 | bookmark.url = 'http://' + bookmark.url; |
||
316 | } |
||
317 | |||
318 | if (bookmark.added) { |
||
319 | bookmark.added_date.setTime(parseInt(bookmark.added) * 1000); |
||
320 | } |
||
321 | |||
322 | if (!bookmark.title) |
||
323 | bookmark.title = ''; |
||
324 | |||
325 | var html = tmpl("item_tmpl", bookmark); |
||
326 | if (position === "prepend") { |
||
327 | $('.bookmarks_list').prepend(html); |
||
328 | } else { |
||
329 | $('.bookmarks_list').append(html); |
||
330 | } |
||
331 | var line = $('div[data-id="' + bookmark.id + '"]'); |
||
332 | line.data('record', bookmark); |
||
333 | if (taglist !== '') { |
||
334 | line.append('<p class="bookmark_tags">' + taglist + '</p>'); |
||
335 | } |
||
336 | line.find('a.bookmark_tag').bind('click', addFilterTag); |
||
337 | line.find('.bookmark_link').click(recordClick); |
||
338 | line.find('.bookmark_delete').click(delBookmark); |
||
339 | line.find('.bookmark_edit').click(editBookmark); |
||
340 | |||
341 | } |
||
342 | |||
343 | function updateOnBottom() { |
||
344 | //check wether user is on bottom of the page |
||
345 | var top = $('.bookmarks_list>:last-child').position().top; |
||
346 | var height = $('.bookmarks_list').height(); |
||
347 | // use a bit of margin to begin loading before we are really at the |
||
348 | // bottom |
||
349 | if (top < height * 1.2) { |
||
350 | getBookmarks(); |
||
351 | } |
||
352 | } |
||
353 | |||
354 | function recordClick() { |
||
355 | $.ajax({ |
||
356 | type: 'POST', |
||
357 | url: 'bookmark/click', |
||
358 | data: 'url=' + encodeURIComponent($(this).attr('href')) |
||
359 | }); |
||
360 | } |
||
361 | |||
362 | function hasProtocol(url) { |
||
363 | var regexp = /(ftp|http|https|sftp)/; |
||
364 | return regexp.test(url); |
||
365 | } |
||
366 | |||
367 | function renameTag() { |
||
368 | if ($('input[name="tag_new_name"]').length) |
||
369 | return; // Do nothing if a tag is currenlty edited |
||
370 | var tagElement = $(this).closest('li'); |
||
371 | tagElement.append('<form><input name="tag_new_name" type="text"></form>'); |
||
372 | var form = tagElement.find('form'); |
||
373 | //tag_el.find('.tags_actions').hide(); |
||
374 | var tagName = tagElement.find('.tag').hide().text(); |
||
375 | tagElement.find('input').val(tagName).focus().bind('blur', function () { |
||
376 | form.trigger('submit'); |
||
377 | }); |
||
378 | form.bind('submit', submitTagName); |
||
379 | } |
||
380 | |||
381 | function submitTagName(event) { |
||
382 | event.preventDefault(); |
||
383 | var tagElement = $(this).closest('li'); |
||
384 | var newTagName = tagElement.find('input').val(); |
||
385 | var oldTagName = tagElement.find('.tag').show().text(); |
||
386 | //tag_el.find('.tag_edit').show(); |
||
387 | //tag_el.find('.tags_actions').show(); |
||
388 | tagElement.find('input').unbind('blur'); |
||
389 | tagElement.find('form').unbind('submit').remove(); |
||
390 | |||
391 | if (newTagName !== oldTagName && newTagName !== '') { |
||
392 | //submit |
||
393 | $.ajax({ |
||
394 | type: 'POST', |
||
395 | url: 'tag', |
||
396 | data: {old_name: oldTagName, new_name: newTagName}, |
||
397 | success: function (bookmarks) { |
||
398 | if (bookmarks.status === 'success') { |
||
399 | filterTagsChanged(); |
||
400 | } |
||
401 | } |
||
402 | }); |
||
403 | } |
||
404 | } |
||
405 | |||
406 | function deleteTag() { |
||
407 | var tag_el = $(this).closest('li'); |
||
408 | var old_tag_name = tag_el.find('.tag').show().text(); |
||
409 | OC.dialogs.confirm(t('bookmarks', 'Are you sure you want to remove this tag from every entry?'), |
||
410 | t('bookmarks', 'Warning'), function (answer) { |
||
411 | if (answer) { |
||
412 | $.ajax({ |
||
413 | type: 'DELETE', |
||
414 | url: 'tag', |
||
415 | data: {old_name: old_tag_name}, |
||
416 | success: function (bookmarks) { |
||
417 | if (bookmarks.status === 'success') { |
||
418 | filterTagsChanged(); |
||
419 | } |
||
420 | } |
||
421 | }); |
||
422 | } |
||
423 | }); |
||
424 | } |
||
425 |
You can rewrite this statement in dot notation: