From 6ad87052baffea79fb80af09ed25540b8bd9cb53 Mon Sep 17 00:00:00 2001 From: Alexandre Cloutier Date: Tue, 4 Mar 2014 13:23:55 -0500 Subject: [PATCH] bugFix #0002616 : change the behavior of ApplicationBaseURL. Now the object return a standard path(without a slash at the end of the path) That means every string added the URL ApplicationBaseURL must start with a Slash. --- .gitignore | 1 + UI/SOGoUI/UIxComponent.m | 5 ++- UI/WebServerResources/ContactsUI.js | 14 ++++---- UI/WebServerResources/MailerUI.js | 15 ++++---- UI/WebServerResources/SOGoDragHandles.js | 2 +- UI/WebServerResources/SOGoResizableTable.js | 2 +- UI/WebServerResources/SOGoRootPage.js | 2 +- UI/WebServerResources/SchedulerUI.js | 38 ++++++++++----------- UI/WebServerResources/UIxComponentEditor.js | 6 ++-- UI/WebServerResources/UIxFilterEditor.js | 2 +- UI/WebServerResources/UIxPreferences.js | 2 +- UI/WebServerResources/generic.js | 19 ++++------- 12 files changed, 53 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index 88becdaa6..8a8a0121d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ SoObjects/SOGo/SOGo.framework/ SoObjects/SOGo/derived_src/ Tests/*/config.py *.pyc +._* diff --git a/UI/SOGoUI/UIxComponent.m b/UI/SOGoUI/UIxComponent.m index f80e9e9ec..336bd734d 100644 --- a/UI/SOGoUI/UIxComponent.m +++ b/UI/SOGoUI/UIxComponent.m @@ -359,6 +359,7 @@ static SoProduct *commonProduct = nil; { SOGoObject *currentClient, *parent; BOOL found; + NSString *hostLessURL; Class objectClass, userFolderClass; // , groupFolderClass @@ -386,8 +387,10 @@ static SoProduct *commonProduct = nil; } else currentClient = [WOApplication application]; + + hostLessURL = [[currentClient baseURLInContext: context] hostlessURL]; - return [[currentClient baseURLInContext: context] hostlessURL]; + return [hostLessURL substringToIndex: [hostLessURL length] - 1]; } - (NSString *) ownPath diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index 935daf3c9..fea8c4d85 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -258,7 +258,7 @@ function _onContactMenuAction(folderItem, action, refresh) { } } - var url = ApplicationBaseURL + selectedFolderId + "/" + action; + var url = ApplicationBaseURL + "/" + selectedFolderId + "/" + action; var uids = contactIds.collect(function (s) { return encodeURIComponent(s.unescapeHTML()); }).join('&uid='); @@ -290,7 +290,7 @@ function onMenuExportContact (event) { var contactIds = document.menuTarget.collect(function(row) { return row.readAttribute("id"); }); - var url = ApplicationBaseURL + selectedFolderId + "/export" + var url = ApplicationBaseURL + "/" + selectedFolderId + "/export" + "?uid=" + contactIds.join("&uid="); window.location.href = url; } @@ -469,7 +469,7 @@ function onToolbarWriteToSelectedContacts(event) { showAlertDialog(_("Please select a contact.")); } else { - openMailComposeWindow(ApplicationBaseURL + "../Mail/compose" + openMailComposeWindow(ApplicationBaseURL + "/../Mail/compose" + "?folder=" + Contact.currentAddressBook.substring(1) + "&uid=" + rows.join("&uid=")); if (document.body.hasClassName("popup")) @@ -777,7 +777,7 @@ function onAddressBookImport(event) { var node = $("contactFolders").getSelectedNodes().first(); var folderId = node.getAttribute("id"); - var url = ApplicationBaseURL + folderId + "/import"; + var url = ApplicationBaseURL + "/" + folderId + "/import"; $("uploadForm").action = url; $("contactsFile").value = ""; @@ -853,7 +853,7 @@ function onAddressBookRemove(event) { } else { var folderId = node.getAttribute("id"); - var folderUrl = ApplicationBaseURL + folderId; + var folderUrl = ApplicationBaseURL + "/" + folderId; unsubscribeFromFolder(folderUrl, owner, onFolderUnsubscribeCB, folderId); } } @@ -879,7 +879,7 @@ function deletePersonalAddressBookConfirm(folderId) { document.deletePersonalABAjaxRequest.aborted = true; document.deletePersonalABAjaxRequest.abort(); } - var url = ApplicationBaseURL + folderId + "/delete"; + var url = ApplicationBaseURL + "/" + folderId + "/delete"; document.deletePersonalABAjaxRequest = triggerAjaxRequest(url, deletePersonalAddressBookCallback, folderId); @@ -1596,7 +1596,7 @@ function dropSelectedContacts(action, toId) { if ((!currentFolderIsRemote() || action != "move") && fromId.substring(1) != toId) { - var url = ApplicationBaseURL + fromId + "/" + action; + var url = ApplicationBaseURL + "/" + fromId + "/" + action; var uids = contactIds.collect(function (s) { return encodeURIComponent(s.unescapeHTML()); }).join('&uid='); diff --git a/UI/WebServerResources/MailerUI.js b/UI/WebServerResources/MailerUI.js index 9b98b8d14..8e535f3b7 100644 --- a/UI/WebServerResources/MailerUI.js +++ b/UI/WebServerResources/MailerUI.js @@ -40,7 +40,8 @@ function URLForFolderID(folderID, application) { application = UserFolderURL + application + "/"; else application = ApplicationBaseURL; - var url = application + encodeURI(folderID.substr(1)); + + var url = application + encodeURI(folderID); if (url[url.length-1] == '/') url = url.substr(0, url.length-1); @@ -563,7 +564,7 @@ function deleteSelectedMessagesCallback(http) { } function deleteMessagesWithoutTrash(data) { - var url = ApplicationBaseURL + encodeURI(data["mailbox"]) + "/batchDelete"; + var url = ApplicationBaseURL + encodeURI(data["/mailbox"]) + "/batchDelete"; var parameters = "uid=" + data["id"].join(",") + '&withoutTrash=1'; data["withoutTrash"] = true; triggerAjaxRequest(url, deleteSelectedMessagesCallback, data, parameters, @@ -767,7 +768,7 @@ function composeNewMessage() { else account = null; if (account) { - var url = ApplicationBaseURL + encodeURI(account) + "/compose"; + var url = ApplicationBaseURL + encodeURI("/" + account) + "/compose"; openMailComposeWindow(url); } } @@ -1601,7 +1602,7 @@ function onReadMessageConfirmMDN(event) { var messageURL; if (window.opener && window.opener.Mailer) { /* from UIxMailPopupView */ - messageURL = (ApplicationBaseURL + encodeURI(mailboxName) + messageURL = (ApplicationBaseURL + encodeURI("/" + mailboxName) + "/" + messageName); } else { @@ -2020,7 +2021,7 @@ function initMailboxTree() { var chainRq = new AjaxRequestsChain(initMailboxTreeCB); for (var i = 0; i < mailAccounts.length; i++) { - var url = ApplicationBaseURL + i + "/mailboxes"; + var url = ApplicationBaseURL + "/" + i + "/mailboxes"; chainRq.requests.push([url, onLoadMailboxesCallback, i]); } chainRq.start(); @@ -2255,7 +2256,7 @@ function buildMailboxes(accountIdx, encoded) { function getFoldersState() { if (mailAccounts.length > 0) { - var urlstr = ApplicationBaseURL + "foldersState"; + var urlstr = ApplicationBaseURL + "/foldersState"; triggerAjaxRequest(urlstr, getFoldersStateCallback); } } @@ -2279,7 +2280,7 @@ function getFoldersStateCallback(http) { function saveFoldersState() { if (mailAccounts.length > 0) { var foldersState = mailboxTree.getFoldersState(); - var urlstr = ApplicationBaseURL + "saveFoldersState"; + var urlstr = ApplicationBaseURL + "/saveFoldersState"; var parameters = "expandedFolders=" + foldersState; triggerAjaxRequest(urlstr, saveFoldersStateCallback, null, parameters, { "Content-type": "application/x-www-form-urlencoded" }); diff --git a/UI/WebServerResources/SOGoDragHandles.js b/UI/WebServerResources/SOGoDragHandles.js index e6144ad73..882c38517 100644 --- a/UI/WebServerResources/SOGoDragHandles.js +++ b/UI/WebServerResources/SOGoDragHandles.js @@ -186,7 +186,7 @@ var SOGoDragHandlesInterface = { }, saveDragHandleState: function (type, position, fcn) { if (!$(document.body).hasClassName("popup")) { - var urlstr = ApplicationBaseURL + "saveDragHandleState" + var urlstr = ApplicationBaseURL + "/saveDragHandleState" + "?" + type + "=" + position; var callbackFunction = fcn || this.saveDragHandleStateCallback; triggerAjaxRequest(urlstr, callbackFunction); diff --git a/UI/WebServerResources/SOGoResizableTable.js b/UI/WebServerResources/SOGoResizableTable.js index ca5ff2803..10694296f 100644 --- a/UI/WebServerResources/SOGoResizableTable.js +++ b/UI/WebServerResources/SOGoResizableTable.js @@ -73,7 +73,7 @@ var SOGoResizableTableInterface = { saveColumnsState: function() { this.computeColumnsWidths(); if (!$(document.body).hasClassName("popup")) { - var url = ApplicationBaseURL + "saveColumnsState"; + var url = ApplicationBaseURL + "/saveColumnsState"; var data = this.ratios; var columns = data.keys(); var params = "columns=" + columns.join(",") diff --git a/UI/WebServerResources/SOGoRootPage.js b/UI/WebServerResources/SOGoRootPage.js index 09edd17b1..a2300ee62 100644 --- a/UI/WebServerResources/SOGoRootPage.js +++ b/UI/WebServerResources/SOGoRootPage.js @@ -158,7 +158,7 @@ function redirectToUserPage() { && !userName.endsWith(loginSuffix)) userName += loginSuffix; var address = "" + window.location.href; - var baseAddress = ApplicationBaseURL + encodeURIComponent(userName); + var baseAddress = ApplicationBaseURL + "/" + encodeURIComponent(userName); var altBaseAddress; if (baseAddress[0] == "/") { var parts = address.split("/"); diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index 5efecbd57..17d93d45a 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -112,7 +112,7 @@ function updateEventFromDragging(controller, eventCells, eventDelta) { _editRecurrenceDialog(eventCell, "confirmAdjustment", params); else { var urlstr = (ApplicationBaseURL - + eventCell.calendar + "/" + eventCell.cname); + + "/" + eventCell.calendar + "/" + eventCell.cname); if (eventCell.recurrenceTime) urlstr += "/occurence" + eventCell.recurrenceTime; urlstr += ("/adjust?" + params); @@ -123,7 +123,7 @@ function updateEventFromDragging(controller, eventCells, eventDelta) { } function performEventAdjustment(folder, event, recurrence, params) { - var urlstr = ApplicationBaseURL + folder + "/" + event; + var urlstr = ApplicationBaseURL + "/" + folder + "/" + event; if (recurrence) urlstr += "/" + recurrence; urlstr += "/adjust" + generateQueryString(params); @@ -170,7 +170,7 @@ function onMenuNewTaskClick(event) { function _editEventId(id, calendar, recurrence) { var targetname = "SOGo_edit_" + id; - var urlstr = ApplicationBaseURL + calendar + "/" + id; + var urlstr = ApplicationBaseURL + "/" + calendar + "/" + id; if (recurrence) { urlstr += "/" + recurrence; targetname += recurrence; @@ -211,7 +211,7 @@ function _batchDeleteEvents() { // Delete the events of the next calendar var calendar = calendarsOfEventsToDelete.shift(); var events = eventsToDelete.shift(); - var urlstr = (ApplicationBaseURL + calendar + var urlstr = (ApplicationBaseURL + "/" + calendar + "/batchDelete?ids=" + events.join(',')); document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr, deleteEventCallback, @@ -439,7 +439,7 @@ function copyEventToPersonalCalendar(event) { function copyEvents() { var path = eventsToCopy.shift(); - var urlstr = ApplicationBaseURL + path; log (urlstr); + var urlstr = ApplicationBaseURL + "/" + path; log (urlstr); triggerAjaxRequest(urlstr, copyEventCallback); } @@ -469,7 +469,7 @@ function onMenuRawEvent(event) { var calendar = selectedCalendarCell[0].calendar; var cname = selectedCalendarCell[0].cname; - var url = ApplicationBaseURL + calendar + "/" + cname + "/raw"; + var url = ApplicationBaseURL + "/" + calendar + "/" + cname + "/raw"; openGenericWindow(url); } @@ -706,7 +706,7 @@ function getEventById(cname, owner) { function _editRecurrenceDialog(eventCell, method, params) { var targetname = "SOGo_edit_" + eventCell.cname + eventCell.recurrenceTime; - var urlstr = (ApplicationBaseURL + eventCell.calendar + "/" + eventCell.cname + var urlstr = (ApplicationBaseURL + "/" + eventCell.calendar + "/" + eventCell.cname + "/occurence" + eventCell.recurrenceTime + "/" + method); if (params && params.length) { urlstr += "?" + params; @@ -719,7 +719,7 @@ function _editRecurrenceDialog(eventCell, method, params) { function onViewEvent(event) { if (event.detail == 2) return; - var url = ApplicationBaseURL + this.calendar + "/" + this.cname; + var url = ApplicationBaseURL + "/" + this.calendar + "/" + this.cname; if (typeof this.recurrenceTime != "undefined") url += "/occurence" + this.recurrenceTime; @@ -846,7 +846,7 @@ function performEventDeletion(folder, event, recurrence) { // Only one recurrence var occurenceTime = recurrence.substring(9); var nodes = _eventBlocksMatching(folder, event, occurenceTime); - var urlstr = ApplicationBaseURL + folder + "/" + event + "/" + recurrence + "/delete"; + var urlstr = ApplicationBaseURL + "/" + folder + "/" + event + "/" + recurrence + "/delete"; if (nodes) document.deleteEventAjaxRequest = triggerAjaxRequest(urlstr, @@ -1224,7 +1224,7 @@ function loadNextView(event) { } function changeDateSelectorDisplay(day, keepCurrentDay) { - var url = ApplicationBaseURL + "dateselector"; + var url = ApplicationBaseURL + "/dateselector"; if (day) { if (day.length < 8) day += "01"; @@ -1254,7 +1254,7 @@ function changeDateSelectorDisplay(day, keepCurrentDay) { function changeCalendarDisplay(data, newView) { newView = ((newView) ? newView : currentView); - var url = ApplicationBaseURL + newView; + var url = ApplicationBaseURL + "/" + newView; var day = null; var scrollEvent = null; if (data) { @@ -1591,7 +1591,7 @@ function refreshCalendarEvents(scrollEvent) { document.refreshCalendarEventsAjaxRequest.aborted = true; document.refreshCalendarEventsAjaxRequest.abort(); } - var url = (ApplicationBaseURL + "eventsblocks?sd=" + sd + "&ed=" + ed + var url = (ApplicationBaseURL + "/eventsblocks?sd=" + sd + "&ed=" + ed + "&view=" + currentView); document.refreshCalendarEventsAjaxRequest = triggerAjaxRequest(url, refreshCalendarEventsCallback, @@ -2156,7 +2156,7 @@ function _loadEventHref(href) { document.eventsListAjaxRequest.aborted = true; document.eventsListAjaxRequest.abort(); } - var url = ApplicationBaseURL + href; + var url = ApplicationBaseURL + "/" + href; document.eventsListAjaxRequest = triggerAjaxRequest(url, eventsListCallback, href); @@ -2168,7 +2168,7 @@ function _loadTasksHref(href) { document.tasksListAjaxRequest.aborted = true; document.tasksListAjaxRequest.abort(); } - url = ApplicationBaseURL + href; + url = ApplicationBaseURL + "/" + href; var tasksList = $("tasksList"); var selectedIds; @@ -2788,7 +2788,7 @@ function marksTasksAsCompleted () { } function _updateTaskCompletion (task, value) { - url = (ApplicationBaseURL + task.calendar + url = (ApplicationBaseURL + "/" + task.calendar + "/" + task.cname + "/changeStatus?status=" + value); triggerAjaxRequest(url, refreshTasks, null); @@ -2802,7 +2802,7 @@ function onMenuRawTask(event) { return; } - var url = ApplicationBaseURL + selectedTasks[0].calendar + "/" + selectedTasks[0].cname + "/raw" + var url = ApplicationBaseURL + "/" + selectedTasks[0].calendar + "/" + selectedTasks[0].cname + "/raw" openGenericWindow(url); } @@ -3221,7 +3221,7 @@ function deletePersonalCalendarConfirm() { this.deselect(); this.hide(); removeFolderRequestCount++; - var url = ApplicationBaseURL + "/" + folderId + "/delete"; + var url = ApplicationBaseURL + folderId + "/delete"; triggerAjaxRequest(url, deletePersonalCalendarCallback, this); disposeDialog(); } @@ -3366,7 +3366,7 @@ function onListCollapse(event, element) { }); } - var url = ApplicationBaseURL + "saveListState"; + var url = ApplicationBaseURL + "/saveListState"; var params = "state=" + state; triggerAjaxRequest(url, null, null, params, { "Content-type": "application/x-www-form-urlencoded" }); @@ -3411,7 +3411,7 @@ function onDocumentKeydown(event) { function saveTabState(event) { var tab = $(event).memo; - var url = ApplicationBaseURL + "saveSelectedList"; + var url = ApplicationBaseURL + "/saveSelectedList"; var params = "list=" + tab; triggerAjaxRequest(url, null, null, params, { "Content-type": "application/x-www-form-urlencoded" }); diff --git a/UI/WebServerResources/UIxComponentEditor.js b/UI/WebServerResources/UIxComponentEditor.js index bee362407..87a20bd61 100644 --- a/UI/WebServerResources/UIxComponentEditor.js +++ b/UI/WebServerResources/UIxComponentEditor.js @@ -347,7 +347,7 @@ function onPopupRecurrenceWindow(event) { if (ComponentEditor.recurrenceWindow && ComponentEditor.recurrenceWindow.open && !ComponentEditor.recurrenceWindow.closed) ComponentEditor.recurrenceWindow.focus(); else - ComponentEditor.recurrenceWindow = window.open(ApplicationBaseURL + "editRecurrence", + ComponentEditor.recurrenceWindow = window.open(ApplicationBaseURL + "/editRecurrence", sanitizeWindowName(activeCalendar + activeComponent + "Recurrence"), "width=500,height=400"); } @@ -373,7 +373,7 @@ function onPopupReminderWindow(event) { else { var height = (emailAlarmsEnabled ? 235 : 150); ComponentEditor.reminderWindow - = window.open(ApplicationBaseURL + "editReminder", + = window.open(ApplicationBaseURL + "/editReminder", sanitizeWindowName(activeCalendar + activeComponent + "Reminder"), "width=255,height=" + height); } @@ -400,7 +400,7 @@ function onOkButtonClick (e) { else if (value == 3) action = 'tentative'; else if (value == 4) { - var url = ApplicationBaseURL + activeCalendar + '/' + activeComponent; + var url = ApplicationBaseURL + "/" + activeCalendar + "/" + activeComponent; delegateInvitation(url, modifyEventCallback); } diff --git a/UI/WebServerResources/UIxFilterEditor.js b/UI/WebServerResources/UIxFilterEditor.js index 3d38c5da1..52e1bdf3c 100644 --- a/UI/WebServerResources/UIxFilterEditor.js +++ b/UI/WebServerResources/UIxFilterEditor.js @@ -38,7 +38,7 @@ function onLoadHandler() { } function loadMailboxes() { - var url = ApplicationBaseURL + "Mail/0/mailboxes"; + var url = ApplicationBaseURL + "/Mail/0/mailboxes"; triggerAjaxRequest(url, onLoadMailboxesCallback); } diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index e1a8880ce..c342ffa1f 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -328,7 +328,7 @@ function updateSieveFilterRow(filterTable, number, filter) { } function _editFilter(filterId) { - var urlstr = ApplicationBaseURL + "editFilter?filter=" + filterId; + var urlstr = ApplicationBaseURL + "/editFilter?filter=" + filterId; var win = window.open(urlstr, "sieve_filter_" + filterId, "width=560,height=380,resizable=0"); if (win) diff --git a/UI/WebServerResources/generic.js b/UI/WebServerResources/generic.js index 89149d9a0..03aff58ae 100644 --- a/UI/WebServerResources/generic.js +++ b/UI/WebServerResources/generic.js @@ -91,6 +91,7 @@ function createElement(tagName, id, classes, attributes, htmlAttributes, parentN function URLForFolderID(folderID) { var folderInfos = folderID.split(":"); var url; + if (folderInfos.length > 1) { url = UserFolderURL + "../" + encodeURI(folderInfos[0]); if (!(folderInfos[0].endsWith('/') @@ -100,9 +101,8 @@ function URLForFolderID(folderID) { } else { var folderInfo = folderInfos[0]; - if (ApplicationBaseURL.endsWith('/') - && folderInfo.startsWith('/')) - folderInfo = folderInfo.substr(1); + if (!(folderInfo.startsWith('/'))) + folderInfo = "/" + folderInfo; url = ApplicationBaseURL + encodeURI(folderInfo); } @@ -173,9 +173,7 @@ function sanitizeWindowName(dirtyWindowName) { function openUserFolderSelector(callback, type) { var urlstr = ApplicationBaseURL; - if (! urlstr.endsWith('/')) - urlstr += '/'; - urlstr += ("../../" + UserLogin + "/Contacts/userFolders"); + urlstr += ("/../../" + UserLogin + "/Contacts/userFolders"); var div = $("popupFrame"); if (div) { @@ -328,7 +326,7 @@ function openMailTo(senderMailTo) { if (sanitizedAddresses.length > 0) openMailComposeWindow(ApplicationBaseURL - + "../Mail/compose?mailto=" + encodeURIComponent(Object.toJSON(sanitizedAddresses)) + + "/../Mail/compose?mailto=" + encodeURIComponent(Object.toJSON(sanitizedAddresses)) + ((subject.length > 0)?"?subject=" + encodeURIComponent(subject):"")); return false; /* stop following the link */ @@ -1803,12 +1801,7 @@ function CurrentModule() { if (ApplicationBaseURL) { var parts = ApplicationBaseURL.split("/"); var last = parts.length - 1; - while (last > -1 && parts[last] == "") { - last--; - } - if (last > -1) { - module = parts[last]; - } + module = parts[last]; } return module;