I attach th diff file between th version 3.9.0-4 in Stretch and the version in testing 4.0.0-beta4. -- Mechtilde Stehmann ## Apache OpenOffice.org ## Freie Office Suite für Linux, MacOSX, Windows ## Debian Developer ## Loook, calender-exchange-provider, libreoffice-canzeley-client ## PGP encryption welcome ## Key-ID 0x141AAD7F
diff -Nru calendar-exchange-provider-3.9.0/build.sh calendar-exchange-provider-4.0.0~beta4/build.sh --- calendar-exchange-provider-3.9.0/build.sh 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/build.sh 2017-07-03 22:10:10.000000000 +0200 @@ -1,28 +1,32 @@ #!/bin/sh -usage() { echo "Usage: $0 [-u | -d ]" 1>&2;echo "-u:enable update";echo "-d:disable update"; exit 1; } +usage() { + printf "Usage: %s [ -u | -d ]\n" "$0" 1>&2 + printf " -u enable update\n" 1>&2 + printf " -d disable update\n" 1>&2 + exit 1 +} -if [ $# = 0 ];then -usage +if [ $# = 0 ];then + usage fi -version=`sed -n -e "s/.*<em:version>\(.*\)<\/em:version>/\1/p" install.rdf` -while getopts ":ud" OPTION +version=$(sed -n -e "s/.*<em:version>\(.*\)<\/em:version>/\1/p" install.rdf) +while getopts ":ud" OPTION do case ${OPTION} in u) echo "update" - cat defaults/preferences/update_enable.txt > defaults/preferences/update.js - zip -r exchangecalendar-v$version.xpi * -x \*.git \*.xpi \*.sh update\*.txt - exit - ;; + cat defaults/preferences/update_enable.txt > defaults/preferences/update.js + zip -r exchangecalendar-v"$version".xpi ./* -x \*.git \*.xpi \*.sh update\*.txt + exit + ;; d) echo "no update" - cat defaults/preferences/update_disable.txt > defaults/preferences/update.js - zip -r exchangecalendar-v$version.xpi * -x \*.git \*.xpi \*.sh update\*.txt - exit - ;; + cat defaults/preferences/update_disable.txt > defaults/preferences/update.js + zip -r exchangecalendar-v"$version".xpi ./* -x \*.git \*.xpi \*.sh update\*.txt + exit + ;; *) usage ;; esac done - -usage +usage diff -Nru calendar-exchange-provider-3.9.0/CHANGELOG.md calendar-exchange-provider-4.0.0~beta4/CHANGELOG.md --- calendar-exchange-provider-3.9.0/CHANGELOG.md 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/CHANGELOG.md 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,684 @@ +# Change Log +All notable changes to this project will be documented in this file. + +## [4.0.0-beta4] - 2017-07-03 +### Added +- Turkish localization #43, #44, #46 +- Missing release notes of 3.9 and 3.8 releases #35 +- Support for shared task list #41 + +### Changed +- Clean up and improve compatibility of build scripts #38, #40 + +### Fixed +- File permissions #36 +- HTML content editor #28, #29 +- Activate Italian localization #46 + +## [4.0.0-beta3] - 2017-06-25 +### Added +- Added Italian translation #22 + +### Changed +- Updated README.md #26, master + +### Fixed +- Colorpick on calender creation doesn't work #19 +- Can't update tasks/events descriptions #5 + +## [4.0.0-beta2] - 2017-06-10 +### Fixed +- Opening and working with Attachment dialog #12 + +## [3.9.0] - unknown release date +- Stable Release +- Support enabled for TB 50.* +- Tested on TB 45.5.1 Lightning 4.7.4 +- We don't support TB/Lightning beta. +- bug: add new calendar or no password prompt + +## [3.8.0] - unknown release date +- Support of Thunderbird 45.0 +- Support to Office365 calendar new calendar. Note: New users has to Create calendar using office365 type. +- fix auto discovery for new hosted calendar +- fix cancelled not removed +- fix forward event +- d9f170f fix #459 #426 #466 #464 #462 remove extra info +- 1d4b8b4 fix #459 #426 #466 #464 #462 +- 0d1a78a fix: #459 +- 5e02727 (origin/master, origin/HEAD, master) rename folowup mail window +- ab836f9 task-fixed +- eaa1c2d (HEAD -> ec-3.8, tag: v3.8-beta3) bump-version +- a641199 (master) bump-version-tb-support +- 98c047c (origin/master, origin/HEAD) status-undefined-for-ipmnote +- c8af0bd strict-error +- 78377ee Merge branch 'master' into ec-3.8 +- 8edfea3 js strict error +- 65f46a5 strict error +- 4f92738 js strict error + +## [3.7.0] - unknown release date +- d1b2860 (origin/master, origin/HEAD, master) revert calendar-event-dialog +- df713f4 Merge pull request #458 from enozkan/patch-5 +- 180e91a Update preferences.dtd for Turkish locale + +## [3.6.0] - unknown release date +- a2a50be strict mode error fix +- 5db3c8d task sync and strict mode error fix +- 16d56bf translation for preference password fix +- 22850a8 preference password fix +- 1fcaf4c Merge pull request #423 from Dominique-2202/patch-2 +- 6b16cad French translation calendar-summary-dialog.dtd +- ae091d5 Merge pull request #422 from Mechtilde/Translation +- d716986 German translation for calendar-summary-dialog.dtd +- 65c222a Merge pull request #415 from enozkan/patch-4 +- 1fd65b1 Merge pull request #416 from Trim/erFindContactsOffset +- 23ca0b3 Merge pull request #417 from Trim/erFindCalendarItems +- e537089 Update calendar-summary-dialog.dtd for tr +- 7b4b9fb erFindContacts: give a copy of arrays to callback +- 2235634 erFindContacts: Use server offset instead of own computation +- b7dd3aa erFindContacts: remove trailing blanks and use contact logs instead of main logs +- 9a5b78d erFindContacts: Requests all contacts of address books +- 4681316 erFindCalendarItems: use slice method to clone javascript arrays +- 91ac17f erFindCalendarItems: don't cal too many times possibly big array +- b45a6f4 erFindCalendarItems: use LOG instead of dump +- 3f9de40 string not translatable #409 +- 9a82408 its good to have xpi filename with 'v' preceeding the version + +## [3.5.0] - unknown release date +- Fix Thunderbird hangs on startup +- Fix Be more defensive about terminating the loop: under some circumstances startYearDay (and I presume startYear) can be greater than endYear[Day] on entry to the loop. +- Fix Reword log, Bug #373 "Incorrect exhortationto MAIL THIS LINE TO ..." +- Fix Bug #371 "Cannot add custom reminder (alarm) to an event ..." +- Fix Lightning 4.0.2.1 + +## [3.4.0] - unknown release date +- New Support Extended to Lightning 4.0.0.1 +- New Support Extended to Thunderbird 38.* +- New EWS Tagger - Feature +- New Task Email Follow Up - Feature +- New Language Support For exchange address Book +- New Mail folder Delegation - Feature +- New Automatically set lightning time zone +- New Plug in Builder for deb package + +- Fix Reminder Problem +- Fix #190 - Can not add manually add exchange address book +- Fix Calendar not refreshing during suspend/resume +- Fix Busy/Free information wasn’t available +- Fix Ignore domain request for email user names. +- Fix freezing on start up +- Fix Restoring cache +- Fix rtews.dtd typo fixed +- Fix Cant not add Google calendar +- Fix Avoid JS exception in auto completion. +- Fix Also fill out primary email address if local ID is present +- Fix Treat public DLs the same way as private ones in auto completion +- Fix Exchange Icon Update in preference +- Fix Missing Translation English language +- Fix Israel Timezone fix for Daylight savings time +- Fix Password Looping fix +- New Updated French,German Translation +- New Preference for mail properties syncing +- New Preference for Email Follow up + +- Change Update suggestions only for stable release +- Change Minimum Refresh time is set to 60 +- Change Enabled Cache by default or No disable option for cache +- Change Removed all calendar Refresh time +- Change Optimized syncing method +- Change Enable NTLM by default in Thunderbird +- Change Remove old saved password if user doesn’t choose +- Change Block adding domain entry in autodiscovery window when email used +- Change Platform based CSS thanks to git-hub user "@mariolorenz" +- Change Clear Logging. + +## [3.3.2] - unknown release date +- Bug fix release + +## [3.3.1] - unknown release date +- New New Column for invite mail in message list pane +- New Support for Thunderbird Nightly Aurora 38.0+ +- New Locale improved +- New Delegating Calendar feature +- New Auto-update from Git-hub releases +- New High priority mails with auto tagging - important + +- Changed Meetings that are canceled are removed +- Changed New Event usability issue in lightning +- Changed Priority column with updated icons,startup preference +- Changed Cache Clear on Add on Update + +- Fixed Dismissing reminder +- Fixed Accept/Tentative/Reject button appearance +- Fixed Fix Address Book freeze when attempting to view "Properties" +- Fixed Tentative status does not get saved +- Fixed Unable to forward event in Thunderbird +- Fixed Breaking other add on columns in message list pane +- Fixed UX error when saving Out of Office + +## [3.2.0] - unknown release date +- changed add-on name to "Exchange EWS Provider" as it is shorter than including all the exchange versions it can connect to. +- Fixes bug where sometimes the date/time is shifted on Free/busy info in calendar of someone else. +- Added preference userAgent. User can now specify their own userAgent string to use in communication. +- Fixes Bug 277 - Cannot extend the time on a calendar event (Exchange2007) +- Improved Out Of Office text editor so it is fully HTML aware again. +- Improved memory usage. It shoud use less memory now. Please read bug 279 on https://www.1st-setup.nl/bugzilla +- Fixed Bug 287 - no folder details anymore in the ews settings of calendar +- Fixed a bug where it was not possible to create an exception. +- Update on French locale. +- Fixed Bug 291 - Modify instance of recurring meeting fails silently +- Added Access Control List functionality of Lightning to follow user rights and permissions. +- Russian translation is added. +- Fixed problem with new exchange versions of Office365 and Exchange2013. +- User can mark calendar as readonly. This state is preserved between restarts. +- Rich text editing of description (body) part for calendar items and task items. +- Fixed problem where offline cache became out of sync. +- You can click on links in the description text of invitation and read-only events/tasks + +## [3.2.0-Beta20] - unknown release date +- Fixed Bug 276 - Duplicate entries, wrong hours and sometimes missing entries when viewving other calendars + +## [3.2.0-Beta16] - unknown release date +- Fixed Bug 273 - Tmezone in US or Canada triggers XML error and results in HTTP 400 Bad Request. + +## [3.2.0-Beta14] - unknown release date +- Received new German translation from Björn Töpper. +- Fixed some small outstanding bugs which will get mentioned when I release the final version. + +## [3.2.0-Beta11] - unknown release date +- Bug 267 - Problem with upgrade from 3.1.2-bug175-3 to 3.2.0-Beta10 + +## [3.2.0-Beta10] - unknown release date +- Fixed problem where the add-on would not show events and task against an Exchange2013 server. +- Changed the title of the add-on to "Exchange 2007/2010/2013 Calendar, Tasks, Contacts and GAL Provider" +- Started work on improving the progress tooltip info. +- Fixes bug 162 Changing recurring meeting to Wednesdays, moved it to Thursday + +## [3.2.0-Beta9] - unknown release date +- Introduced loading/showing image when one is available for a contact (addressbook). Only works starting from Exchange server 2010_SP2 +- Fixes a bug where creation of new tasks and Event was not possible since Beta8. +- Finalized autocompletion. Depending on the connetion speed with the exchange server it can take some time to fill the autocomplete list. + +## [3.2.0-Beta8] - unknown release date +- Introduced an icon which shows connection status to the exchange server. +- Introduced autocompletion. It works but could use some refinement. +- Improved CPU load when the add-on has problems connecting to the exchange server . + +## [3.2.0-Beta6] - unknown release date +- Improved copying between exchange calendars and non exchange calendars. +- Fixed snooze/dismiss reminder problems for events and tasks. +- Improved UI scripts used in XUL. +- Fixes Bug 264 - Schema failure when dismissing a reminder +- Fixes Bug 261 - Number of jobs in Status Bar increasing +- Fixes Bug 255 - Complete state of tasks not working in today pane +- Fixes Bug 254 - NewEventInterfaces lists calendars twice +- Fixes Bug 253 - Import Calendar into Exchange Calendar / copy calendar items from one to another +- Fixes Bug 252 - Internal server error on reminder dismissal + +## [3.2.0-Beta5] - unknown release date +- Fixed working with attachments lists in the different views/dialogs/panes +- Customized settings reminders on events and tasks according to what is possible in Exchange. +- Fixes Bug 255 - Complete state of tasks not working in today pane +- Fixes Bug 256 - Set custom reminder on task created in outlook without due or entry date not possible + +## [3.2.0-Beta4] - unknown release date +- Split mivExchangeEvent object into mivExchangeEvent and mivExchangeBaseItem. As preparation for mivExchangeTodo. +- Improved the conversion from Exchange Timezone to Lightning timezone and from Lightning timezone to Exchange timezone. +- Added the Exchange task/todo detail fields. Lightning does not known about the by default. +- Fixes Bug 63 - Repeating tasks posted to Exchange Server have incorrect due date/time +- Fixes Bug 107 - Snooze state of tasks gets lost after restart +- Fixes Bug 194 - Tasks appear at wrong date +- Fixes Bug 215 - Snoozed task reminders continually pop up, dismissing task reminders takes 2 clicks of Dismiss +- Fixes Bug 235 - Try to set a task due date aways sets the current date time +- Fixes Bug 250 - No tasks with current 3.2.0 beta + +## [3.2.0-Beta3] - unknown release date +- Fixes Bug 150 - Dismissing reminders asks to send update for meeting +- Fixes Bug 180 - NTLM and Kerberos fail +- Fixes bug 229 - Creating a custom repeating event - creates event on following day +- Fixes bug 238 - "All day Event" created for day prior to selected date +- Fixes bug 241 - Autodiscover RedirectAddr not followed +- Fixes bug 246 - Modifying recurring meeting resulted in "modification failed" errors +- Moved exchangecalendar object into it's own interface. +- Create our own recurrenceInfo object/interface. + +## [3.2.0-Beta2] - unknown release date +- Fixes bug 241 - Autodiscover RedirectAddr not followed + +## [3.2.0-Beta1] - unknown release date +- Added own ExchangeEvent Interface. With this creation of items from cache or exchange server should be faster. +- Converted handling of timezones to own interface. +- Timezone of Lightning events are set to those of Exchange. As close as possible because the timezone databases between Exchange and Lighting are not the same. +- Added new SOAP Autodiscovery functionality which is supported since Exchange2010. It will use this when available. + +## [3.1.102] - unknown release date +- Fixes bug 226: No more than 20 contacts are shown. + +## [3.1.99] - unknown release date +- Fixes Bug 212 - version >= 3.x leaks memory +- Fixes Bug 211 - 3.1.2 breaks login (3.1.1 working) +- Fixes Bug 188 - Adding a new Exchange 2010 EWS Calendar via add-on goes into an infinite password prompt loop +- Fixes Bug 173 - Exchange 2007/2010 Calendar and Tasks Provider deletes Outlook Calendar entries +- Fixes Bug 164 - Can not Connect to server +- Fixes Bug 159 - Thunderbird freezes +- Fixes Bug 157 - Infinity Loope for Password/Username +- Fixes Bug 143 - The adding uses wrong folder and does not fetch contacts + +## [3.1.2] - unknown release date +- Fixed bug 175: After 10 calendars the jobs will hang up +- Fixed bug 201: Number of Jobs displayed in status bar is negative +- Added new loadbalancer for request to Exchange servers. You can now control the simultaneous request to the exchange server. +- Created new interface for the global functions. +- Added extra info to progress indicator. It now also uses the new loadbalancer for the statistics. + +## [3.1.1] - unknown release date +- Fixed bug 205 Extension overwrites URI for non-exchange calendars + +## [3.1.0] - unknown release date +- Fixed part of bug51. When emailaddress of attendee is empty do not throw an error. +- Fixed: Bug where removal of last attachment was not possible. +- Enhancement: Startup of Thunderbird has been improved. +- Fixed problem when turning off and on offlineCache. + +## [3.0.2] - unknown release date +- Minor bug fix. + +## [3.0.1] - unknown release date +- Fixed bug 196: Version 3.0.0-rc3 seems to interfere with address autocompletion +- Fixed bug 204: Thunderbird hangs when creating a new item with attachment +- Added automatic update functionality. This will check the developer website for new versions and give the change to autmoatically install it. + +## [3.0.0] - unknown release date +- Removed all references to e4x +- Removed some bugs and stabilized the code. + +## [3.0.0-rc4] - unknown release date +- Add Japanese translation. +- Added fix for new chunked message responses from Exchange server. + +## [3.0.0-rc3] - unknown release date +- Optimized the code to improve speed. + +## [3.0.0-rc2] - unknown release date +- Optimized the xml handling code so startup and other communications are faster. + +## [3.0.0-rc1] - unknown release date +- Converted last part, editing of tasks, from e4x to xml2jxon. + +## [3.0.0-beta4] - unknown release date +- Fixed problem where a reminder change (dismiss or new time) was not saved to exchange. + +## [3.0.0-beta3] - unknown release date +- Fixed bug 182: Reoccuring Events keep popping up in reminder. + +## [3.0.0-beta2] - unknown release date +- Fixed two parts which were not yet converted. Editing of tasks still to do. + +## [3.0.0-beta] - unknown release date +- Complete rewrite of all xml handling stuff from using e4x to the new xmlToJxon object. + +## [2.2.3] - unknown release date +- Fixed: bug 176 - Calendars whose names contains a slash can't be opened + +## [2.2.2] - unknown release date +- Fixed: bug 160 - Meeting invitation received does not get added after accepting + +## [2.2.1] - unknown release date +- Fixed bug when closing TB the offline cache would be emptyed. +- Fixed: Bug 161 - pb accessing calendars + +## [2.2.0] - unknown release date +- Fixed complaint of ad-on checker. +- Fixed bug of cloning a calendar showed empty fields. + +## [2.1.4] - unknown release date +- Fixed: "Unresponsive script" bug. + +## [2.1.3] - unknown release date +- Fixed: Bug 52 - Incorrect sync: random calendar events missing, others duplicated + +## [2.1.2] - unknown release date +-Fixed: Bug 118 - Kerberos authentication broken in 1.8.11 + +## [2.1.1] - unknown release date +- Fixed: Bug 151 - Email id property of exchange calendar becomes None on updating thunderbird to 13.0 +- Fixed: Bug 153 - "allday" event -> invite someone -> password request -> communication stopped +- Improved: Disabled calendars are not started on TB startup. +- Fixed: The way a calendar startup after is has been created newly. + +## [2.1.0] - unknown release date +- Fixed filtering of events +- Fixed saving of the EWS settings. +- Fixed calendarReset. +- Improved getItems function. + +## [2.0.5] - unknown release date +- Added: Processing of getItemsFromOfflineCache into a seperate thread. +- Fixed: Problem when turning on offline cache this would only start after restarting TB. + +## [2.0.4] - unknown release date +- Fixed: bug with reminders in offline cache. +- Added: Extra dialog when answering an invitation. + +## [2.0.2] - unknown release date +- Improved: Further improved Offline cache items retrieval. +- Fixed: Bug when receiving a HTTP 302 relative redirect. Because of a typo in the code it threw an exception. Possibly bug 51. + +## [2.0.1] - unknown release date +- Improved: Offline cache items retrieval. + +## [2.0.0] - unknown release date +- Added: Offline cache functionality. (When not connected or offline it goes into Read-Only mode) +- Added: Invitation forwarding functionality. + +## [1.8.19] - unknown release date +- Fixes: problem where Out Of Office stopped working int TB12. Fix replaces the WYSIWYG editor into a flat text editor. +- Fixes: Several small bugs. + +## [1.8.18] - unknown release date +- Addedd access to exchange contacts folders. (Currently READ-ONLY) +- Fixed: Problem with dismissing and snoozing alarms. +- Fixed: Problem on autodiscovery where sometimes a EWS URL select list was shown with duplicate entries. +- Fixed: Other small problems. +- Fixed: Bug 116 - Authentication fails after Thunderbird-restart +- Fixed: Bug 24 - Accepting or rejecting of invitations changes owner + +## [1.8.16] - unknown release date +- Fixed: Bug 122 - New: I get "Event Invitation" email for my own meetings when I import them +- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future +- Fixed a lot of smaller bugs. + +## [1.8.13] - unknown release date +- Fixed: Bug 120 - All my calendar appointments are not visible in Thunderbird +- Fixed: Bug 94 - Credentials (Username, Password) for calendars are not stored + +## [1.8.12] - unknown release date +- Fixed: Bug 117 - tasks calendar shows calendar items +- Fixed: Problem where only Free/Busy information would be shown for defalt personal calendar. + +## [1.8.6] - unknown release date +- Fixed: Bug 111 - No events are visible when user only has calendar permission to see Free/Busy info + +## [1.8.5] - unknown release date +- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future occurrences +- Fixed: Bug 107 - Snooze state of tasks gets lost after restart +- Updated: Code for setting of alarms and snooze parameters changed completely. + +## [1.8.4] - unknown release date +- Fixed: Bug 103 - aListener not defined in calExchangeCalendar +- Added: Global minimal memory cache size preferences. + +## [1.8.3] - unknown release date +- fixed: Bug 102 - Extension continually asks for password + +## [1.8.1] - unknown release date +- Fixed: Bug 99 - Tasks do not show up in the tasks pane/tab + +## [1.8.0] - unknown release date +- Added: Full attachment functionality. +- Fixed: Bug 97 - Last month's events are missing + +## [1.7.18] - unknown release date +- Fixed: Bug it is not possible to accept or decline a meeting invitation + +## [1.7.17] - unknown release date +- Fixed: Bug where a HTTP 302 redirect which was called as an error was not handled correctly. +- Fixed: Bug 31 - Unable to invite attendees +- Fixed: Bug 45 - Cannot display users own calendar +- Fixed: Bug 68 - MenuItems for creating new items are disabled +- Fixed: Bug 77 - Lightening fails to save Microsoft Live Meeting style events to the Exchange calendar +- Fixed: Bug 80 - request response HTTP 302 redirect is NOT redirected and communication stops +- Fixed: Bug 82 - Copying of events from google calendar does not work +- Fixed: Bug 83 - Can't add a calendar -> HTTP-ERROR 500 +- Fixed: Bug 84 - checks performed on disabled calendars +- Fixed: Bug 85 - Can't open or save file attachments in a calendar meeting +- Fixed: Bug 86 - Invalid log path on Windows +- Added: When you try to access another person's calendar but do not have full read permissions it will switch and only tries to get Free/Busy/Tentative/OOF information. +- Added: The domainname is no longer a required field +- Added: German localization +- Added: Setting logging preferences can now be done from the TB preferences. +- Added: Exporting to ICS. Currently it only export what is has requested from the Exchange server. Default a period of one month ahead and one month back from currentdate. +- Changed: Changed default CalendarPollInterval to once every 60 seconds and InboxPollInterval to once every 180 seconds. + +## [1.7.15] - unknown release date +- Fixed: Bug 59 - Exchange sends extra invitations when first one is accepted +- Fixed: Bug 32 - Unable to add event to calendar using iTIP buttons +- Fixed: Bug 33 - Accept multiple-day appointment request via iTIP creates single-day event +- Fixed: Bug 61 - Error: reference to invalid character number when trying to pull in calendar +- Fixed: Bug 62 - Moving calendar item from one calendar to another fails +- Added: Functionality to clone an Exchange Calendar. +- Fixed: Bug 19 - Event stays shown after deletion +- Fixed: Bug 66 - No workflow (accept, reject, ...) buttons are shown in invitations +- Fixed: Bug 65 - read only of calendar +- Added: New debugging preferences and possibility to create a log/debug file. +- Added: Finer info/error control in communication object. + +## [1.7.13] - unknown release date +- Added: Folder properties visible in EWS Settings dialog. +- Added: Mouse cursor wait indication when browsing folders. +- Added: Add a new calendar base on the information in a share calendar invitation from someone. +- Fixed: BUG 54 Shared Calendar w/notification: error when closing +- Fixed: BUG 55 Can't set reminder for a task +- Added: Opening and saving of attachments. (ReadOnly) +- Added: Check if lightning is installed and active. When not it will show a warning. +- Added: Functionality to migrate an Exchange Provider add-on calendar to this add-on. +- Added: User can change poll interval for calendar through EWS Settings. +- Fixed: Bug 56 - Not possible to acknowledge repeating meeting +- Fixed: Small bug when importing an invitation send from a Google Calendar. It does not contain timezone information. +- Fixed: Bug 38 - Invalid security certificate +- Added: Mouse cursor wait indicatie when checking server and username on creating an calendar or changing the server settings. + + +## [1.7.12] - unknown release date +- Added: Support for Seamonkey. +- Added: Access to public/shared folders without a mailbox. Only windows username, domain & password required. +- Added: You can use now a username consisting of a username part followed by ampersand (@) and full domainname and empty domain field or a username and domain field value. +- Fixed: BUG37. Alarm info on a master calendar item is not show correctly. +- Fixed: BUG41. Synching meetings with empty titles fails +- Added: French localization. +- Fixed: Bug 44 - Synchronizaton fails when a calendar item has no start date +- Fixed: Bug 39 - Accepting a meeting does not get updated in Lightning +- Added: Importing ICS file. +- Change: Changed namespacing on request of Mozilla. + + +## [1.7.11] - unknown release date +- Modified: Debug log lines show more usefull information. +- Fixed: BUG 30: Accept via iTIP button fails for requests sent to distribution lists +- Improved: The processing of meeting invitations is complete. Even the iTIP buttons work. + +## [1.7.10a3] - unknown release date +- Fixed an Exchange server version problem in function GetMeetingRequestByUID. It did not work correctly on Exchange 2007 + +## [1.7.10a1] - unknown release date +- Fixed: BUG 28 "NL -> EN translation string" EN != "Settings voor calendar" +- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner". Meeting invitations are not yet working as wanted when using iTIP buttons. + +## [1.7.9] - unknown release date +- Fixed: Meeting requests and updates to these requests were not processed in the right way. + +## [1.7.8] - unknown release date +- Fixed: BUG 25 Recuring event with reminder prevents calendar refresh +- Fixed: BUG 26 Deleting a single occurrence in a sequence has no effect +- Fixed: BUG 27 Today Pane Tasks fails to show newly created tasks + +## [1.7.7] - unknown release date +- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner" +- Fixed: Stabilized meeting invitations in global. Now works with distribution lists, other alias name, etc... + +## [1.7.7a3] - unknown release date +- Fixed: BUG 23 "Request sent instead of Confirmation; wrong Timezone" +- Fixed: Trying to mark a task as completed gives an update error: "CompleteDate cannot be set to a date in the future." +- Fixed: Removing the completed task status through the checkbox in the task view produces an error. + +## [1.7.7a2] - unknown release date +- Fixed: Could not respond to aa meeting invitation where the mailbox name was different in character Upper/Lowercase than the emailaddress in the invitation. + +## [1.7.7a1] - unknown release date +- Fixed: Chagning/updating of an existing item where you are the organiser but also on the attendee list, created by outlook, gave an error. +- Added: The add-on now modifies the Exchange nextreminderdate on the Exchange server as the old Exchange provider add-on did. This is part of the merge of the add-ons. + +## [1.7.6] - unknown release date +- Added: Progres indicator with tooltip. (closes BUG report 14) +- Solved: BUG 16 Cannot create event due to Time Zone error (reported by Sven) +- solved: BUG 17 Out of office retrieval of incorrect values (reported by Sven) +- Solved: When you are editing Out Of Office settings and had the externel reply window open and did a save the text for the external reply was changed by the internal reply message. +- Added: It is not possible anymore to add tasks to a calendar folder and calendaritems in a tasks folder. This would produce an error. +- Fixed: BUG 18 Changing the end or start date of an allday event produces an error. (reported by Sven) + +## [1.7.5] - unknown release date +- Minor changes to keep the add-on working in version 10.0a2. +- Fixed: Problem where timezone information downloading did not work for exchange 2007. + +## [1.7.4] - unknown release date +- Added: The snooze and dismiss states are saved on the exchange server so they survive a restart of TB. Was a problem when "show missed alarms" was on. (BUG 12 reported by pazz) +- Solved: Shut-down is faster. + +## [1.7.3] - unknown release date +- Solved: BUG 11/ During creation of an allday event with a reminder or turning on the reminder on an existing allday event triggers an error and change is not saved. (reported by gislair) + +## [1.7.2] - unknown release date +- Solved: When the windows account got locked the password manager kept asking for a password. Now after tree failed attempts it will stop asking until a restart. +- Solved: Respong to a meeting request through the iTIP buttons generated an error and did not work. + +## [1.7.1] - unknown release date +- Solved: When an organiser removed a meeting which was confirmed the update in your calendar was performed every 3 seconds. + +## [1.7.0] - unknown release date +- Changed: Folder browser shows different icons for different folderclass property. +- Solved: Removing a meeting in a public folder did not work an give error. +- Solved: Buttons Save and cancel in the EWS settings dialog would drop of dialog window. +- Major version changed into 1 because the add-on is feature complete. + +## [0.7.47] - unknown release date +- New: Selecting the right folder below the folderbase can now be done through a folder browser. + +## [0.7.46] - unknown release date +- Improved: Creation, modification and deletion of repeating events. + +## [0.7.45] - unknown release date +- Solved: Removing a repeating event did not allways work. + +## [0.7.44] - unknown release date +- Solved: Creating an all day event did not work anymore. + +## [0.7.42] - unknown release date +- Solved: Some alarms could not be removed. +- Solved: For repeating meetings multiple alarms were shown, with same titel and date, when option show missed alarms was on in Lightning settings. +- Added: Option to automatically remove responses to meetingrequest from your inbox when you are not the organiser. +- Solved: BUG10 reported by P.Palai. + +## [0.7.41] - unknown release date +- Solved: Checking/searching for certain folderpath locations did not work. +- Solved: Manipulating occurrences in a repeating meeting did not always work. +- Solved: Changing the EWS settings did not refresh the calendar and therefore the changes were not visible. + +## [0.7.40] - unknown release date +- Some small changed to make shared funcitonality available to the Exchange Contacts add-on +- Meetingrequest in a non personal folder we show als invitation request to the use. Now they are not shown anymore as invitation request. +- Added different job queues for synchronization and modify actions to the EWS server. During startup changes are show earlier. + +## [0.7.39] - unknown release date +- User must choose to whom invitation updates are send. +- Added a new calender folder poller which will sync by default every 10 seconds. + +## [0.7.38] - unknown release date +- Changes in meetings in personal calendars will be send always to all involved persons. +- In a later version the extension will ask the user to specify what he wants (send updates or not) + +## [0.7.37] - unknown release date +- Fixed problem where after an autodiscovery and server and mailbox check did not work. +- Removing a calendar will remove all settings and running processes. + +## [0.7.36] - unknown release date +- Fixed a warning in the Mozilla tests. + +## [0.7.35] - unknown release date +- Fixed bug (reported by Tudor Timisescu). Check for server and mailbox did not work anymore. + +## [0.7.34] - unknown release date +- Added management of Out of Office settings. + +## [0.7.33] - unknown release date +- Added three new options to the EWS preferences for each calendar. +- Completed list of "base folder" options. + +## [0.7.32] - unknown release date +- EWS Timezome information added for Exchange2007(_SP1) servers +- Problems with allday event solved (see version 0.7.30) +- Tasks date and times are working now for different timezones. +- Version is stable for production use. + +## [0.7.31] - unknown release date +- Fixed upgrade problem between versions 0.7.29 and 0.7.30 + +## [0.7.30] - unknown release date +- Timezone is added correctly. There is even a difference between a 2010 or 2007 version of Exchange. +- Starting mechanism is optimized. +- A calendar reset is done completely now. +- Known problem: If you add a alldayevent EWS will add an extra day infront of it. So 1 allday becomes two. + +## [0.7.29] - unknown release date +- Added the posibility to change your reaction to an invitation request in the meetingresponse screen. + +## [0.7.28] - unknown release date +- Addedd extra options to the EWS Settings. + +## [0.7.27] - unknown release date +- Fixed bug 6. TB becomes unresponsive on paging back in week view. + +## [0.7.26] - unknown release date +- Extra settings for each calendar (poll inbox) +- Inbox poller results are better processed. +- Settings are now saved in the right location within preferences.. + +## [0.7.22] - unknown release date +- Deleting of an occurrence from a string does work now. +- Alarms can be dismissed or gesnoozed. + This status is not saved between TB restarts. + This is an in memory status maintained by TB. + +## [0.7.21] - unknown release date +- iTIP processing improved. + +## [0.7.20] - unknown release date +- Settings and alarm on recurring appointments is better handled. + +## [0.7.19] - unknown release date +- Fixed BUG 4. +- Fixed BUG 5. +- So called observers are broken down in the right way. + +## [0.7.18] - unknown release date +- Fixed BUG 3. +- Alarm changing improved. + +## [0.7.17] - unknown release date +- Fixed BUG 2. + +## [0.7.16] - unknown release date +- Task alarms are being set in the right way. +- Dismiss or snooze the alarm of a task is working now. + +## [0.7.15] - unknown release date +- Removed all storage of passwords in Memory. All password are only stored by the default Thunderbird Password Manager. + +## [0.7.14] - unknown release date +- Imporved iTIP processing. + +## [0.7.13] - unknown release date +- Source code cleanup. +- Exception "nsIAuthPrompt2.asyncPromptAuth" solved. +- Failures during creating connections to server are better handled. + +## [0.7.12] - unknown release date +- Changed text on buttons for MessageRespons screen. +- Fixed where it was not possible to create an alldayevent. +- Dismissing an alarm will work. + +## [0.7.11] - unknown release date +- Improved iTIP processing. + +## [0.7.10] - unknown release date +- Fixed problem for date/time conversions. Through this problem some appointments were show on the wrong date or time. diff -Nru calendar-exchange-provider-3.9.0/chrome/content/attachments-view.js calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.js --- calendar-exchange-provider-3.9.0/chrome/content/attachments-view.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.js 2017-07-03 22:10:10.000000000 +0200 @@ -44,6 +44,7 @@ } exchAttachments.prototype = { + _initialized: false, addAttachmentDialog: function _addAttachmentDialog() { @@ -227,45 +228,75 @@ } }, + /** + * Receives asynchronous messages from the parent context that contains the iframe. + * + * @param {MessageEvent} aEvent Contains the message being received + */ + receiveMessage: function _receiveMessage(aEvent) { + let validOrigin = gTabmail ? "chrome://messenger" : "chrome://calendar"; + if (aEvent.origin !== validOrigin) { + return; + } + switch (aEvent.data.command) { + case "exchWebService_addAttachmentDialog": this.addAttachmentDialog(); break; + } + }, + onLoad: function _onLoad() { + if(this._initialized){ + return; + } + + var self = this; + if (this._document.getElementById("calendar-task-tree")) { this.globalFunctions.LOG(" -- calendar-task-tree --"); - var self = this; this._document.getElementById("calendar-task-tree").addEventListener("select", function(){ self.onSelectTask();}, true); return; - } + } var args = this._window.arguments[0]; var item = args.calendarEvent; - //this.globalFunctions.LOG(" -- onLoad 2 ("+this.globalFunctions.STACKshort()+")"); this.attachmentListboxVisible = false; + // We can't update toolbar from iframe if ((item.calendar) && (item.calendar.type == "exchangecalendar")) { this.globalFunctions.LOG(" -- It is an Exchange Calendar event:"+item.title); - - try { - // Hide Lightning URL button - this._document.getElementById("button-url").hidden = true; - this._document.getElementById("event-toolbar").setAttribute("currentset", "button-save,button-attendees,button-privacy,button-url,exchWebService-add-attachment-button,button-delete"); - this._document.getElementById("exchWebService-add-attachment-button").hidden = false; - if(this._document.getElementById("options-attachments-menuitem")){ - this._document.getElementById("options-attachments-menuitem").setAttribute("label", this._document.getElementById("exchWebService-add-attachment-button").getAttribute("label")); - this._document.getElementById("options-attachments-menuitem").setAttribute("command", "exchWebService_addAttachmentDialog"); - } + if (this._document.getElementById("event-grid-attachment-row")) { + this._document.getElementById("event-grid-attachment-row").setAttribute("collapsed", true); } - catch (ex) {this.globalFunctions.LOG(" -- Could not add exchange attachment buttons:"+ex.toString());} - // calendar-event-dialog (hide existing attachment view) - try { - this._document.getElementById("event-grid-attachment-row").setAttribute("collapsed", "true"); - } - catch (ex) {} + // Modify context menu for the attachment list inside the "Attachment" panel + let attachmentListbox = this._document.getElementById("attachment-link"); + + attachmentListbox.setAttribute("context", "exchWebService-attachment-popup") ; + attachmentListbox.setAttribute("onkeypress", function (aEvent) { self.onKeyPress(aEvent); }) ; + attachmentListbox.setAttribute("onclick", function (aEvent) { self.onSelect(aEvent); }) ; + attachmentListbox.setAttribute("ondblclick", function (aEvent) { self.onDblClick(aEvent); }) ; this.addAttachmentsFromItem(item); + } else { + if (this._document.getElementById("event-grid-attachment-row")) { + this._document.getElementById("event-grid-attachment-row").setAttribute("collapsed", false); + } + + // Modify context menu for the attachment list inside the "Attachment" panel + let attachmentListbox = this._document.getElementById("attachment-link"); + + attachmentListbox.setAttribute("context", "attachment-popup") ; + attachmentListbox.setAttribute("onkeypress", "attachmentLinkKeyPress(event)") ; + attachmentListbox.setAttribute("onclick", "attachmentClick(event);") ; + attachmentListbox.setAttribute("ondblclick", "attachmentDblClick(event)") ; } + + // Add message listener to be able to receive message from parent window or tab + window.addEventListener("message", function(aEvent) { self.receiveMessage(aEvent); }, false); + + this._initialized = true; }, addAttachmentsFromItem: function _addAttachmentsFromItem(aItem) @@ -584,6 +615,6 @@ } var tmpAttachment = new exchAttachments(document, window); -window.addEventListener("load", function _onLoad() { window.removeEventListener("load",arguments.callee,false); tmpAttachment.onLoad(); }, true); +window.addEventListener("load", function _onLoad() { tmpAttachment.onLoad(); }, false); diff -Nru calendar-exchange-provider-3.9.0/chrome/content/attachments-view.xul calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.xul --- calendar-exchange-provider-3.9.0/chrome/content/attachments-view.xul 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.xul 2017-07-03 22:10:10.000000000 +0200 @@ -47,20 +47,19 @@ <overlay id="exchWebService-attachment-view" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> - <script type="application/javascript" src="chrome://exchangecalendar/content/attachments-view.js"/> + <script type="application/javascript" src="chrome://exchangecalendar/content/attachments-view.js"/> <!-- Commands --> - <commandset id="itemCommands"> + <commandset> <command id="exchWebService_openAttachment" - oncommand="tmpAttachment.openAttachment();"/> + oncommand="tmpAttachment.openAttachment();"/> <command id="exchWebService_saveAttachment" - oncommand="tmpAttachment.saveAttachment();"/> + oncommand="tmpAttachment.saveAttachment();"/> <command id="exchWebService_deleteAttachment" - oncommand="tmpAttachment.deleteAttachment();"/> - <command id="exchWebService_addAttachmentDialog" - oncommand="tmpAttachment.addAttachmentDialog();"/> + oncommand="tmpAttachment.deleteAttachment();"/> </commandset> + <!-- Update context popup--> <popupset id="event-dialog-popupset"> <menupopup id="exchWebService-attachment-popup"> <menuitem id="exchWebService-attachment-popup-open" @@ -74,26 +73,9 @@ <menuitem id="exchWebService-attachment-popup-delete" label="&event.menu.item.delete.label;" accesskey="&event.menu.item.delete.accesskey;" - disable-on-readonly="true" + disable-on-readonly="true" command="exchWebService_deleteAttachment"/> </menupopup> </popupset> - - <toolbarpalette id="event-toolbarpalette"> - <toolbarbutton id="exchWebService-add-attachment-button" - mode="dialog" - class="cal-event-toolbarbutton toolbarbutton-1" - label="&exchWebServie.add.attachment.button.label;" - disable-on-readonly="true" - removable="true" - command="exchWebService_addAttachmentDialog" - oncommand="tmpAttachment.addAttachmentDialog();" - hidden="true"/> - </toolbarpalette> - <toolbar id="event-toolbar" defaultset="button-save,button-attendees,button-privacy,button-url,exchWebService-add-attachment-button,button-delete"> - </toolbar> - </overlay> - - diff -Nru calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog-attendees.xml calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog-attendees.xml --- calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog-attendees.xml 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog-attendees.xml 2017-07-03 22:10:10.000000000 +0200 @@ -66,7 +66,7 @@ completedefaultindex="true" forcecomplete="true" minresultsforpopup="1" - onblur="if (this.localName == 'textbox') document.getBindingParent(this).onBlurInput(event);" + onblur="if (this.localName === 'textbox') document.getBindingParent(this).onBlurInput(event);" ignoreblurwhilesearching="true" oninput="this.setAttribute('dirty', 'true');"> </xul:textbox> @@ -138,7 +138,7 @@ numRowsAdded++; } } - if (numRowsAdded == 0) { + if (numRowsAdded === 0) { this.appendAttendee(null, listbox, template, false); } diff -Nru calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.js calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.js --- calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.js 2017-07-03 22:10:10.000000000 +0200 @@ -1,40 +1,10 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: GPL 3.0 - * - * The contents of this file are subject to the General Public License - * 3.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.gnu.org/licenses/gpl.html - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * -- Exchange 2007/2010 Calendar and Tasks Provider. - * -- For Thunderbird with the Lightning add-on. - * - * Author: Michel Verbraak (info@1st-setup.nl) - * Website: http://www.1st-setup.nl/wordpress/?page_id=133 - * email: exchangecalendar@extensions.1st-setup.nl - * - * - * This code uses parts of the Microsoft Exchange Calendar Provider code on which the - * "Exchange Data Provider for Lightning" was based. - * The Initial Developer of the Microsoft Exchange Calendar Provider Code is - * Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London - * Portions created by the Initial Developer are Copyright (C) 2009 - * the Initial Developer. All Rights Reserved. - * - * ***** BEGIN LICENSE BLOCK *****/ var Cu = Components.utils; var Ci = Components.interfaces; var Cc = Components.classes; -Cu.import("resource://calendar/modules/calUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -function exchEventDialog(aDocument, aWindow) +function exchCalendarEventDialog(aDocument, aWindow) { this._document = aDocument; this._window = aWindow; @@ -43,334 +13,47 @@ .getService(Ci.mivFunctions); } -exchEventDialog.prototype = { - - _initialized: false, - _oldCallback: null, - - onAcceptCallback: function _onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing) - { - if ((cal.isEvent(aItem)) && (aCalendar.type == "exchangecalendar")) { - if (!aItem.className) { - var newItem = Cc["@1st-setup.nl/exchange/calendarevent;1"] - .createInstance(Ci.mivExchangeEvent); - newItem.cloneToCalEvent(aItem); - aItem = newItem; - } - } - - if ((!cal.isEvent(aItem)) && (aCalendar.type == "exchangecalendar")) { - // Save extra exchange fields to item. - if (!aItem.className) { - var newItem = Cc["@1st-setup.nl/exchange/calendartodo;1"] - .createInstance(Ci.mivExchangeTodo); - newItem.cloneToCalEvent(aItem); - aItem = newItem; - } - - aItem.totalWork = this._document.getElementById("exchWebService-totalWork-count").value; - aItem.actualWork = this._document.getElementById("exchWebService-actualWork-count").value; - aItem.mileage = this._document.getElementById("exchWebService-mileage-count").value; - aItem.billingInformation = this._document.getElementById("exchWebService-billingInformation-count").value; - aItem.companies = this._document.getElementById("exchWebService-companies-count").value; - } - -try{ - if (this.newItem) { - aItem.bodyType = "HTML"; - aItem.body = this._document.getElementById("exchWebService-body-editor").content; - } - else { - if (aItem.bodyType == "HTML") { - aItem.body = this._document.getElementById("exchWebService-body-editor").content; - } - } -}catch(err){dump("Error saving content\n");} - - if (this._oldCallback) { - this._oldCallback(aItem, aCalendar, aOriginalItem, aIsClosing); - } - }, +exchCalendarEventDialog.prototype = { + /* + * setup menu window and button toolbars when editing an Exchange item + */ onLoad: function _onLoad() { - //onLoad(); - this._document.getElementById("exchWebService-body-editor").setAttribute("scrollbars","yes"); - if (this._window.arguments[0].calendarEvent.calendar.type != "exchangecalendar") { - if (this._document.getElementById("item-description")) { - this._document.getElementById("item-description").hidden = false; - } - if (this._document.getElementById("exchWebService-body-editor")) { - this._document.getElementById("exchWebService-body-editor").hidden = true; - } - return; - } + let args = this._window.arguments[0]; + let item = args.calendarEvent; - if (this._initialized) return; - this._oldCallback = this._window.onAcceptCallback; - var self = this; - this._window.onAcceptCallback = function(aItem, aCalendar, aOriginalItem, aIsClosing) { self.onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing); }; - - if (this._document.getElementById("todo-entrydate")) { - this._initialized = true; - - var args = this._window.arguments[0]; - var item = args.calendarEvent; - this.updateScreen(item, item.calendar); - //Cc["@mozilla.org/consoleservice;1"] - // .getService(Ci.nsIConsoleService).logStringMessage(item.exchangeXML); - -//dump("event.dialog: item.exchangeXML:"+item.exchangeXML+"\n"); - - if ((item.bodyType === undefined) || (item.bodyType == "HTML")) { - if (this._document.getElementById("item-description")) { - this._document.getElementById("item-description").hidden = true; - } - if (this._document.getElementById("exchWebService-body-editor")) { - this._document.getElementById("exchWebService-body-editor").hidden = false; - if (item.bodyType !== undefined) { - this._document.getElementById("exchWebService-body-editor").content = item.body; - } - else { - this.newItem = true; - if (item.body) { - if ((item.body.indexOf("<BODY>") > -1) || (item.body.indexOf("<body>") > -1)) { - this._document.getElementById("exchWebService-body-editor").content = item.body; - } - else { - this._document.getElementById("exchWebService-body-editor").content = this.globalFunctions.fromText2HTML(item.getProperty("DESCRIPTION")); - } - } - else { - this._document.getElementById("exchWebService-body-editor").content = this.globalFunctions.fromText2HTML(item.getProperty("DESCRIPTION")); - } - } - } - } - else { - if (this._document.getElementById("item-description")) { - this._document.getElementById("item-description").hidden = false; - } - if (this._document.getElementById("exchWebService-body-editor")) { - this._document.getElementById("exchWebService-body-editor").hidden = true; - } - } - } - }, - - updateScreen: function _updateScreen(aItem, aCalendar) - { - var item = aItem; + // We can't update toolbar from iframe + if ((item.calendar) && (item.calendar.type == "exchangecalendar")) { - if ((!cal.isEvent(item)) && (aCalendar.type == "exchangecalendar")) { + let eventToolbar = this._document.getElementById("event-toolbar"); - var ownerLabel = this._document.getElementById("exchWebService-owner-label"); - if (ownerLabel) { - ownerLabel.value = item.owner; + // If the standard add url button was enabled, hidde it and show exchangecalendar attachment + let currentSet = eventToolbar.getAttribute("currentset"); + if (currentSet.indexOf("button-url") === 1 + && currentSet.indexOf("exchWebService-add-attachment-button") === -1) { + currentSet = currentSet.replace("button-url", "exchWebService-add-attachment-button"); } - try { - this._document.getElementById("exchWebService-details-row1").removeAttribute("collapsed"); - this._document.getElementById("exchWebService-details-row2").removeAttribute("collapsed"); - this._document.getElementById("exchWebService-details-row3").removeAttribute("collapsed"); - } - catch (ex) {} + // Switch toolbar buttons display + this._document.getElementById("button-url").hidden = true; + this._document.getElementById("exchWebService-add-attachment-button").hidden = false; - this._document.getElementById("exchWebService-owner-row").setAttribute("collapsed", "false"); - this._document.getElementById("exchWebService-details-separator").hidden = false; + // Switch window menu display + this._document.getElementById("options-attachments-menu").collapsed = true; + this._document.getElementById("exchWebService-options-attachments").collapsed = false; - if (item.className) { - this._document.getElementById("exchWebService-totalWork-count").value = item.totalWork; - this._document.getElementById("exchWebService-actualWork-count").value = item.actualWork; - this._document.getElementById("exchWebService-mileage-count").value = item.mileage; - this._document.getElementById("exchWebService-billingInformation-count").value = item.billingInformation; - this._document.getElementById("exchWebService-companies-count").value = item.companies; - } + } else { + // Switch toolbar buttons display + this._document.getElementById("button-url").hidden = false; + this._document.getElementById("exchWebService-add-attachment-button").hidden = true; - this._document.getElementById("event-grid-location-row").hidden = true; - - // Clear reminder select list for todo - this._document.getElementById("reminder-none-separator").hidden = true; - this._document.getElementById("reminder-0minutes-menuitem").hidden = true; - this._document.getElementById("reminder-5minutes-menuitem").hidden = true; - this._document.getElementById("reminder-15minutes-menuitem").hidden = true; - this._document.getElementById("reminder-30minutes-menuitem").hidden = true; - this._document.getElementById("reminder-minutes-separator").hidden = true; - this._document.getElementById("reminder-1hour-menuitem").hidden = true; - this._document.getElementById("reminder-2hours-menuitem").hidden = true; - this._document.getElementById("reminder-12hours-menuitem").hidden = true; - this._document.getElementById("reminder-hours-separator").hidden = true; - this._document.getElementById("reminder-1day-menuitem").hidden = true; - this._document.getElementById("reminder-2days-menuitem").hidden = true; - this._document.getElementById("reminder-1week-menuitem").hidden = true; - - this._document.getElementById("timezone-starttime").hidden = true; - this._document.getElementById("timezone-endtime").hidden = true; - - if (this._document.getElementById("item-repeat")) { - this._document.getElementById("item-repeat").addEventListener("command", function() { self.updateRepeat(); }, false); - } - //this.updateTime(); - this.updateRepeat(); - } - else { - try { - this._document.getElementById("exchWebService-details-row1").setAttribute("collapsed", "true"); - this._document.getElementById("exchWebService-details-row2").setAttribute("collapsed", "true"); - this._document.getElementById("exchWebService-details-row3").setAttribute("collapsed", "true"); - } - catch (ex) {} - - this._document.getElementById("exchWebService-owner-row").setAttribute("collapsed", "true"); - this._document.getElementById("exchWebService-details-separator").hidden = true; - - this._document.getElementById("event-grid-location-row").hidden = false; - this._document.getElementById("event-grid-recurrence-row").hidden=false; - - // Clear reminder select list for todo - this._document.getElementById("reminder-none-separator").hidden = false; - this._document.getElementById("reminder-0minutes-menuitem").hidden = false; - this._document.getElementById("reminder-5minutes-menuitem").hidden = false; - this._document.getElementById("reminder-15minutes-menuitem").hidden = false; - this._document.getElementById("reminder-30minutes-menuitem").hidden = false; - this._document.getElementById("reminder-minutes-separator").hidden = false; - this._document.getElementById("reminder-1hour-menuitem").hidden = false; - this._document.getElementById("reminder-2hours-menuitem").hidden = false; - this._document.getElementById("reminder-12hours-menuitem").hidden = false; - this._document.getElementById("reminder-hours-separator").hidden = false; - this._document.getElementById("reminder-1day-menuitem").hidden = false; - this._document.getElementById("reminder-2days-menuitem").hidden = false; - this._document.getElementById("reminder-1week-menuitem").hidden = false; - - this._document.getElementById("timezone-starttime").hidden = false; - this._document.getElementById("timezone-endtime").hidden = false; - - } - }, - - // This will remove the time value from the repeat part and tooltip. - updateRepeat: function _updateRepeat() - { - var repeatDetails = this._document.getElementById("repeat-details").childNodes; - if (repeatDetails.length == 3) { - this._document.getElementById("repeat-details").removeChild(repeatDetails[2]); - var toolTip = repeatDetails[0].getAttribute("tooltiptext"); - var tmpArray = toolTip.split("\n"); - tmpArray.splice(2,1); - repeatDetails[0].setAttribute("tooltiptext", tmpArray.join("\n")); - repeatDetails[1].setAttribute("tooltiptext", tmpArray.join("\n")); + // Switch window menu display + this._document.getElementById("options-attachments-menu").collapsed = false; + this._document.getElementById("exchWebService-options-attachments").collapsed = true; } }, - - selectedCalendarChanged: function _selectedCalendarChanged(aMenuList) - { - updateCalendar(); - - this.updateScreen(this._window.calendarItem, getCurrentCalendar()); - }, - } -if (!exchWebService) var exchWebService = {}; - -exchWebService.eventDialog = { - - _initialized: false, - onLoad: function _onLoad() { - if (this._initialized) return; - - // exchWebService.eventDialog.updateAttendees(); - }, - - editAttendees: function _editAttendees() { - let savedWindow = window; - let calendar = getCurrentCalendar(); - - var callback = function (attendees, organizer, startTime, endTime) { - savedWindow.attendees = attendees; - if (organizer) { - // In case we didn't have an organizer object before we - // added attendees to our event we take the one created - // by the 'invite attendee'-dialog. - if (savedWindow.organizer) { - // The other case is that we already had an organizer object - // before we went throught the 'invite attendee'-dialog. In that - // case make sure we don't carry over attributes that have been - // set to their default values by the dialog but don't actually - // exist in the original organizer object. - if (!savedWindow.organizer.id) { - organizer.id = null; - } - if (!savedWindow.organizer.role) { - organizer.role = null; - } - if (!savedWindow.organizer.participationStatus) { - organizer.participationStatus = null; - } - if (!savedWindow.organizer.commonName) { - organizer.commonName = null; - } - } - savedWindow.organizer = organizer; - } - var duration = endTime.subtractDate(startTime); - startTime = startTime.clone(); - endTime = endTime.clone(); - var kDefaultTimezone = calendarDefaultTimezone(); - gStartTimezone = startTime.timezone; - gEndTimezone = endTime.timezone; - gStartTime = startTime.getInTimezone(kDefaultTimezone); - gEndTime = endTime.getInTimezone(kDefaultTimezone); - gItemDuration = duration; - // exchWebService.eventDialog.updateAttendees(); - updateDateTime(); - updateAllDay(); - if (isAllDay != gStartTime.isDate) { - setShowTimeAs(gStartTime.isDate) - } - }; - - var startTime = gStartTime.getInTimezone(gStartTimezone); - var endTime = gEndTime.getInTimezone(gEndTimezone); - - var isAllDay = getElementValue("event-all-day", "checked"); - if (isAllDay) { - startTime.isDate = true; - endTime.isDate = true; - endTime.day += 1; - } else { - startTime.isDate = false; - endTime.isDate = false; - } - - var menuItem = document.getElementById('options-timezone-menuitem'); - var displayTimezone = true; - if( menuItem != null) - displayTimezone = menuItem.getAttribute('checked') == 'true'; - - var args = new Object(); - args.startTime = startTime; - args.endTime = endTime; - args.displayTimezone = displayTimezone; - args.attendees = window.attendees; - args.organizer = window.organizer && window.organizer.clone(); - args.calendar = calendar; - args.item = window.calendarItem; - args.onOk = callback; - args.fbWrapper = window.fbWrapper; - - // open the dialog modally - openDialog( - "chrome://calendar/content/calendar-event-dialog-attendees.xul", - "_blank", - "chrome,titlebar,modal,resizable", - args); - } -} - -window.addEventListener("load", exchWebService.eventDialog.onLoad, false); - - -var tmpEventDialog = new exchEventDialog(document, window); -window.addEventListener("load", function () { window.removeEventListener("load",arguments.callee,false); tmpEventDialog.onLoad(); }, true); - +var ewsCalendarEventDialog = new exchCalendarEventDialog(document, window); +window.addEventListener("load", function () { ewsCalendarEventDialog.onLoad(); }, false); diff -Nru calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.xul calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.xul --- calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.xul 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.xul 2017-07-03 22:10:10.000000000 +0200 @@ -1,148 +1,62 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- -/* ***** BEGIN LICENSE BLOCK ***** - * Version: GPL 3.0 - * - * The contents of this file are subject to the General Public License - * 3.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.gnu.org/licenses/gpl.html - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * ## Exchange 2007/2010 Calendar and Tasks Provider. - * ## For Thunderbird with the Lightning add-on. - * - * Author: Michel Verbraak (info@1st-setup.nl) - * Website: http://www.1st-setup.nl/wordpress/?page_id=133 - * email: exchangecalendar@extensions.1st-setup.nl - * - * - * This code uses parts of the Microsoft Exchange Calendar Provider code on which the - * "Exchange Data Provider for Lightning" was based. - * The Initial Developer of the Microsoft Exchange Calendar Provider Code is - * Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London - * Portions created by the Initial Developer are Copyright (C) 2009 - * the Initial Developer. All Rights Reserved. - * - * ***** BEGIN LICENSE BLOCK *****/ ---> -<?xml-stylesheet type="text/css" href="chrome://global/skin/"?> -<?xml-stylesheet type="text/css" href="chrome://global/skin/xul.css"?> -<?xml-stylesheet type="text/css" href="chrome://messenger/skin/messengercompose/messengercompose.css"?> -<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/itemBodyEditor.css"?> -<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/exchWebServiceEditor.css"?> + <!DOCTYPE dialog [ - -<!ENTITY % eventDialogDTD SYSTEM "chrome://calendar/locale/calendar-event-dialog.dtd"> + <!ENTITY % eventDialogDTD SYSTEM "chrome://calendar/locale/calendar-event-dialog.dtd"> %eventDialogDTD; - -<!ENTITY % dtd1 SYSTEM "chrome://exchangecalendar/locale/calendar-event-dialog.dtd" > + <!ENTITY % dtd1 SYSTEM "chrome://exchangecalendar/locale/attachments-view.dtd" > %dtd1; ]> -<?xul-overlay href="chrome://exchangecalendar/content/attachments-view.xul"?> -<overlay id="exchWebService-calendar-event-dialog.xul" - xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + +<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/attachments-view.css"?> +<?xml-stylesheet type="text/css" href="chrome://calendar/skin/calendar-event-dialog.css"?> +<?xml-stylesheet type="text/css" href="chrome://calendar/content/calendar-event-dialog.css"?> + + +<overlay id="exchWebService-calendar-event-dialog" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + <script type="application/javascript" src="chrome://exchangecalendar/content/calendar-event-dialog.js"/> - <script type="application/javascript" src="chrome://calendar/content/calendar-event-dialog.js"/> - <command id="cmd_attendees" - oncommand="exchWebService.eventDialog.editAttendees();"/> - <rows id="event-grid-rows" insertbefore = "event-grid-alarmrow"> - <row id="exchWebService-owner-row" collapsed="true" insertafter="event-grid-title-row"> - <label value="&exchWebService.owner.label;"/> - <label id="exchWebService-owner-label" value=""/> - </row> - <row id="event-grid-category-color-row"> - <hbox id="event-grid-category-box"> - <menulist id="item-calendar" oncommand="tmpEventDialog.selectedCalendarChanged(this);"/> - </hbox> - </row> - <separator id="exchWebService-details-separator" hidden="true" class="groove" insertafter="event-grid-todo-status-row"/> - <row id="exchWebService-details-row1" align="center" - collapsed="true" insertafter="exchWebService-details-separator"> - <label value="&exchWebService.totalWork.label;" - disable-on-readonly="true"/> - <hbox align="center"> - <textbox id="exchWebService-totalWork-count" - increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/> - <label value="&exchWebService.mileage.label;" - disable-on-readonly="true"/> - <textbox id="exchWebService-mileage-count" value="" disable-on-readonly="true"/> - </hbox> - </row> - <row id="exchWebService-details-row2" align="center" - collapsed="true" insertafter="exchWebService-details-row1"> - <label value="&exchWebService.actualWork.label;" - disable-on-readonly="true"/> - <hbox align="center"> - <textbox id="exchWebService-actualWork-count" - increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/> - <label value="&exchWebService.billingInformation.label;" - disable-on-readonly="true"/> - <textbox id="exchWebService-billingInformation-count" value="" disable-on-readonly="true"/> - </hbox> - </row> - <row id="exchWebService-details-row3" align="center" - collapsed="true" insertafter="exchWebService-details-row2"> - <label value="&exchWebService.companies.label;" - disable-on-readonly="true"/> - <textbox id="exchWebService-companies-count" value="" disable-on-readonly="true"/> - </row> - </rows> - <rows flex="1" id="event-grid-rows" > - <row id="exchWebService-owner-row" collapsed="true" insertafter="event-grid-title-row"> - <label value="&exchWebService.owner.label;"/> - <label id="exchWebService-owner-label" value=""/> - </row> - <row id="event-grid-category-color-row"> - <hbox id="event-grid-category-box"> - <menulist id="item-calendar" oncommand="tmpEventDialog.selectedCalendarChanged(this);"/> - </hbox> - </row> - <separator id="exchWebService-details-separator" hidden="true" class="groove" insertafter="event-grid-todo-status-row"/> - <row id="exchWebService-details-row1" align="center" - collapsed="true" insertafter="exchWebService-details-separator"> - <label value="&exchWebService.totalWork.label;" - disable-on-readonly="true"/> - <hbox align="center"> - <textbox id="exchWebService-totalWork-count" - increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/> - <label value="&exchWebService.mileage.label;" - disable-on-readonly="true"/> - <textbox id="exchWebService-mileage-count" value="" disable-on-readonly="true"/> - </hbox> - </row> - <row id="exchWebService-details-row2" align="center" - collapsed="true" insertafter="exchWebService-details-row1"> - <label value="&exchWebService.actualWork.label;" - disable-on-readonly="true"/> - <hbox align="center"> - <textbox id="exchWebService-actualWork-count" - increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/> - <label value="&exchWebService.billingInformation.label;" - disable-on-readonly="true"/> - <textbox id="exchWebService-billingInformation-count" value="" disable-on-readonly="true"/> - </hbox> - </row> - <row id="exchWebService-details-row3" align="center" - collapsed="true" insertafter="exchWebService-details-row2"> - <label value="&exchWebService.companies.label;" - disable-on-readonly="true"/> - <textbox id="exchWebService-companies-count" value="" disable-on-readonly="true"/> - </row> - </rows> - <tabbox - xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" id="event-grid-tabbox" selectedIndex="2" flex="1"> - <tabpanels id="event-grid-tabpanels" flex="1" selectedIndex="2"> - <tabpanel id="event-grid-tabpanel-description"> - <itemBodyEditor id="exchWebService-body-editor" - flex="1" - insertafter="item-description" - disable-on-readonly="true"/> - </tabpanel> - </tabpanels> - </tabbox> -</overlay> \ Kein Zeilenumbruch am Dateiende. + + <!-- Commands --> + <commandset id="itemCommands"> + <command id="exchWebService_addAttachmentDialog" + oncommand='sendMessage( {command: "exchWebService_addAttachmentDialog"} );'/> + </commandset> + + <!-- Update windows menu --> + <toolbox id="event-toolbox"> + <menubar id="event-menubar"> + <menu id="options-menu"> + <menupopup id="options-menupopup"> + <menu id="options-attachments-menu" + collapsed="false" /> + + <menuitem id="exchWebService-options-attachments" + insertafter="options-attendees-menuitem" + label="&exchWebServie.add.attachment.button.label;" + command="exchWebService_addAttachmentDialog" + collapsed="true" /> + </menupopup> + </menu> + </menubar> + </toolbox> + + <!-- Update toolbar --> + <toolbarpalette id="event-toolbarpalette"> + <toolbarbutton id="exchWebService-add-attachment-button" + mode="dialog" + class="cal-event-toolbarbutton toolbarbutton-1" + label="&exchWebServie.add.attachment.button.label;" + disable-on-readonly="true" + removable="true" + command="exchWebService_addAttachmentDialog" + hidden="true"/> + </toolbarpalette> + + <!-- Add exchangecalendar attachment button + Note: defaultset needs to be synced with common-central/calendar/base/content/dialogs/calendar-event-dialog.xul --> + <toolbar id="event-toolbar" + defaultset="button-saveandclose,button-attendees,button-privacy,button-url,exchWebService-add-attachment-button,button-delete" > + </toolbar> + +</overlay> diff -Nru calendar-exchange-provider-3.9.0/chrome/content/ecCalendarCreation.js calendar-exchange-provider-4.0.0~beta4/chrome/content/ecCalendarCreation.js --- calendar-exchange-provider-3.9.0/chrome/content/ecCalendarCreation.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/ecCalendarCreation.js 2017-07-03 22:10:10.000000000 +0200 @@ -147,50 +147,65 @@ }, + /* + * saveSettings: save calendar settings after calendar wizard completed + * + * Lightning original code to save calendar can be found in: + * comm-central/calendar/resources/content/calendarCreation.js + */ saveSettings: function _saveSettings() { this.globalFunctions.LOG("saveSettings Going to create the calendar in prefs.js"); - // Calculate the new calendar.id - var newCalId = this.globalFunctions.getUUID(); + // Calculate the new calendar.id and properties + let newCalId = this.globalFunctions.getUUID(); + let newCalName = this._document.getElementById("calendar-name").value; + let newCalColor = this._document.getElementById("calendar-color").value; // Save settings in dialog to new cal id. tmpSettingsOverlay.exchWebServicesSaveExchangeSettingsByCalId(newCalId); // Need to save the useOfflineCache preference separetly because it is not part of the main. this.prefs = Cc["@mozilla.org/preferences-service;1"] - .getService(Ci.nsIPrefService) - .getBranch("extensions.exchangecalendar@extensions.1st-setup.nl."+newCalId+"."); + .getService(Ci.nsIPrefService) + .getBranch("extensions.exchangecalendar@extensions.1st-setup.nl."+newCalId+"."); this.prefs.setBoolPref("useOfflineCache", this._document.getElementById("exchange-cache").checked); this.prefs.setIntPref("exchangePrefVersion", 1); // We create a new URI for this calendar which will contain the calendar.id - var ioService = Cc["@mozilla.org/network/io-service;1"] - .getService(Ci.nsIIOService); - var tmpURI = ioService.newURI("https://auto/"+newCalId, null, null); + var ioService = Cc["@mozilla.org/network/io-service;1"] + .getService(Ci.nsIIOService); + var tmpURI = ioService.newURI("https://auto/"+newCalId, null, null); + // Register calendar to global settings + var calPrefs = Cc["@mozilla.org/preferences-service;1"] + .getService(Ci.nsIPrefService) + .getBranch("calendar.registry."+newCalId+"."); + calPrefs.setCharPref("name", newCalName); + + // Create the new calendar object + // Should be synced with Lightning doCreateCalendar() code var calManager = Cc["@mozilla.org/calendar/manager;1"] .getService(Ci.calICalendarManager); + var newCal = calManager.createCalendar("exchangecalendar", tmpURI); newCal.id = newCalId; - newCal.name = this._document.getElementById("calendar-name").value; + newCal.name = newCalName; - var calPrefs = Cc["@mozilla.org/preferences-service;1"] - .getService(Ci.nsIPrefService) - .getBranch("calendar.registry."+newCalId+"."); + newCal.setProperty("color", newCalColor); - calPrefs.setCharPref("name", this._document.getElementById("calendar-name").value); + newCal.setProperty("cache.enabled", false); - newCal.setProperty("color", this._document.getElementById('calendar-color').color); if (!this._document.getElementById("fire-alarms").checked) { newCal.setProperty("suppressAlarms", true); } + // End of sync + var emailCalendarIdentity = this._document.getElementById("email-identity-menulist").selectedItem; - var selItem = this._document.getElementById("email-identity-menulist").selectedItem; - if (selItem) { - var identity = selItem.getAttribute("value"); + if (emailCalendarIdentity) { + var identity = emailCalendarIdentity.getAttribute("value"); } else { var identity = ""; @@ -199,13 +214,11 @@ newCal.setProperty("imip.identity.key", identity); - newCal.setProperty("cache.enabled", false); - Cc["@mozilla.org/preferences-service;1"] - .getService(Ci.nsIPrefService).savePrefFile(null); + .getService(Ci.nsIPrefService).savePrefFile(null); + // Finally register completly the new calendar calManager.registerCalendar(newCal); - }, } diff -Nru calendar-exchange-provider-3.9.0/chrome/content/exchangeSettingsOverlay.js calendar-exchange-provider-4.0.0~beta4/chrome/content/exchangeSettingsOverlay.js --- calendar-exchange-provider-3.9.0/chrome/content/exchangeSettingsOverlay.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/exchangeSettingsOverlay.js 2017-07-03 22:10:10.000000000 +0200 @@ -431,7 +431,7 @@ { this.globalFunctions.LOG("exchWebServicesGetFolderOK: aFolderID:"+aFolderID+", aChangeKey:"+aChangeKey+", aFolderClass:"+aFolderClass); - if (aFolderClass == "IPF.Appointment") { + if (aFolderClass == "IPF.Appointment" || aFolderClass == "IPF.Task") { this.exchWebServicesgFolderID = aFolderID; this.exchWebServicesgChangeKey = aChangeKey; this.gexchWebServicesDetailsChecked = true; diff -Nru calendar-exchange-provider-3.9.0/chrome/content/exchService-followup-event-dialog.xml calendar-exchange-provider-4.0.0~beta4/chrome/content/exchService-followup-event-dialog.xml --- calendar-exchange-provider-3.9.0/chrome/content/exchService-followup-event-dialog.xml 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/exchService-followup-event-dialog.xml 2017-07-03 22:10:10.000000000 +0200 @@ -445,7 +445,7 @@ accesskey="&event.menu.options.accesskey;"> <menupopup id="options-menupopup" onpopupshowing="onPopupShowing(this)"> - <menuitem id="options-attendess-menuitem" + <menuitem id="options-attendees-menuitem" label="&event.menu.options.attendees.label;" accesskey="&event.menu.options.attendees.accesskey;" command="cmd_attendees" diff -Nru calendar-exchange-provider-3.9.0/chrome/content/exchWebServiceEditor.xml calendar-exchange-provider-4.0.0~beta4/chrome/content/exchWebServiceEditor.xml --- calendar-exchange-provider-3.9.0/chrome/content/exchWebServiceEditor.xml 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/exchWebServiceEditor.xml 2017-07-03 22:10:10.000000000 +0200 @@ -36,7 +36,12 @@ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <binding id="exchWebServiceEditor"> - <content> + <!-- CSS needed to correctly display color buttons (font and background) --> + <resources> + <stylesheet src="chrome://messenger/skin/messengercompose/messengercompose.css" /> + </resources> + + <content> <xul:vbox flex="1"> <xul:toolbox anonid="FormatToolbox" mode="icons"> @@ -105,7 +110,7 @@ state="state_all"/> <xul:toolbarseparator class="toolbarseparator-standard"/> <xul:toolbaritem class="formatting-button"> - <xul:stack align="enter" state="rgb(102,102,102)"> + <xul:stack align="center" state="rgb(102,102,102)"> <xul:box style="background-color:#FFFFFF" anonid="cmd_backgroundColor" class="color-button" @@ -192,63 +197,72 @@ flex="1"/> </xul:vbox> - </content> + </content> <implementation> <constructor><![CDATA[ - this.editorElement = document.getAnonymousElementByAttribute(this, "anonid", "editor"); var self=this; + + // To be able to set correct HTML content + this.globalFunctions = Components.classes["@1st-setup.nl/global/functions;1"] + .getService(Components.interfaces.mivFunctions); + + this.editorElement = document.getAnonymousElementByAttribute(this, "anonid", "editor"); if (this.editorElement) { this.commandManager = this.editorElement.commandManager; this.editorClickFunction = function(aEvent) { self.onClickEditor(aEvent);}; - this.editorElement.addEventListener("click", this.editorClickFunction, true); + this.editorElement.addEventListener("click", this.editorClickFunction, false); this.editorDblClickFunction = function(aEvent) { self.onDblClickEditor(aEvent);}; - this.editorElement.addEventListener("dblclick", this.editorDblClickFunction, true); + this.editorElement.addEventListener("dblclick", this.editorDblClickFunction, false); this.editorKeyPressFunction = function(aEvent) { self.onKeyPressEditor(aEvent);}; - this.editorElement.addEventListener("keyup", this.editorKeyPressFunction, true); + this.editorElement.addEventListener("keyup", this.editorKeyPressFunction, false); this.editorMouseOver = function(aEvent) { self.onMouseOver(aEvent);}; - this.editorMouseOut = function(aEvent) { self.onMouseOut(aEvent);}; - this.editorElement.addEventListener("mouseover", this.editorMouseOver , false); + + this.editorMouseOut = function(aEvent) { self.onMouseOut(aEvent);}; this.editorElement.addEventListener("mouseout", this.editorMouseOut, false); + // Set default document to empty HTML content + this.editorElement.contentDocument.documentElement.innerHTML = this.globalFunctions.fromText2HTML(null); } - this.atomService = Components.classes["@mozilla.org/atom-service;1"].getService(Components.interfaces.nsIAtomService); + this.atomService = Components.classes["@mozilla.org/atom-service;1"] + .getService(Components.interfaces.nsIAtomService); + + this.connectAllCommandListenerToolbar("FormatToolbar"); - this.connectButtons("FormatToolbar"); // Connect color button this.bgColorFunction = function(){ self.selectColor("cmd_backgroundColor");}; var bgColorElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor") - bgColorElement.addEventListener("click", this.bgColorFunction, true); + bgColorElement.addEventListener("click", this.bgColorFunction, false); this.fontColorFunction = function(){ self.selectColor("cmd_fontColor");}; var fontColorElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor") - fontColorElement.addEventListener("click", this.fontColorFunction, true); + fontColorElement.addEventListener("click", this.fontColorFunction, false); this.highlightColor = "#FFFFFF"; this.fontColor = "#000000"; - // Fill fontfac popup menu + // Connect FontFace popup menu this.menuPopupFunction = function(event){ self.selectFont("cmd_fontFace", event.target.value);}; this.menuPopup = document.getAnonymousElementByAttribute(this, "anonid", "fontFaceSelect"); - this.menuPopup.addEventListener("command", this.menuPopupFunction, true); + this.menuPopup.addEventListener("command", this.menuPopupFunction, false); this.fillFontFace(); + // Connect HyperLink buttons this.addLinkFunction = function(){ self.addLink();}; var addLinkElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_add_link") - addLinkElement.addEventListener("click", this.addLinkFunction, true); + addLinkElement.addEventListener("click", this.addLinkFunction, false); this.removeLinkFunction = function(){ self.removeLink();}; var removeLinkElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_remove_link") - removeLinkElement.addEventListener("click", this.removeLinkFunction, true); + removeLinkElement.addEventListener("click", this.removeLinkFunction, false); this.editLinkFunction = function(){ self.editLink();}; var editLinkElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_edit_link") - editLinkElement.addEventListener("click", this.editLinkFunction, true); - + editLinkElement.addEventListener("click", this.editLinkFunction, false); ]]></constructor> <destructor><![CDATA[ @@ -256,40 +270,52 @@ this.editorElement.removeEventListener("click", this.editorClickFunction, false); this.editorElement.removeEventListener("keyup", this.editorKeyPressFunction, false); - this.editorElement.removeEventListener("dblclick", this.editorDblClickFunction, true); + this.editorElement.removeEventListener("dblclick", this.editorDblClickFunction, false); this.editorElement.removeEventListener("mouseover", this.editorMouseOver , false); this.editorElement.removeEventListener("mouseout", this.editorMouseOut, false); } - this.disconnectButtons("FormatToolbar"); - document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor").removeEventListener("click", this.bgColorFunction, false); - document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor").removeEventListener("click", this.fontColorFunction, false); + + this.removeAllCommandListenerToolbar("FormatToolbar"); + + // Disconnect color button + document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor") + .removeEventListener("click", this.bgColorFunction, false); + document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor") + .removeEventListener("click", this.fontColorFunction, false); + + // Disconnect Font face button if (this.menuPopupFunction) { this.menuPopup.removeEventListener("command", this.menuPopupFunction, false); } - document.getAnonymousElementByAttribute(this, "anonid", "cmd_add_link").removeEventListener("click", this.addLinkFunction, true); - document.getAnonymousElementByAttribute(this, "anonid", "cmd_remove_link").removeEventListener("click", this.removeLinkFunction, true); - document.getAnonymousElementByAttribute(this, "anonid", "cmd_edit_link").removeEventListener("click", this.editLinkFunction, true); + + // Disconnect HyperLink buttons + document.getAnonymousElementByAttribute(this, "anonid", "cmd_add_link") + .removeEventListener("click", this.addLinkFunction, false); + document.getAnonymousElementByAttribute(this, "anonid", "cmd_remove_link") + .removeEventListener("click", this.removeLinkFunction, false); + document.getAnonymousElementByAttribute(this, "anonid", "cmd_edit_link") + .removeEventListener("click", this.editLinkFunction, false); ]]></destructor> - <property name="content"> - <getter> - <![CDATA[ - return this.editorElement.contentDocument.documentElement.innerHTML; - ]]> - </getter> - <setter> - <![CDATA[ - if (this.editorElement) { - this.editorElement.contentDocument.documentElement.innerHTML = val; - } - ]]> - </setter> - </property> + <property name="content"> + <getter> + <![CDATA[ + return this.editorElement.contentDocument.documentElement.innerHTML; + ]]> + </getter> + <setter> + <![CDATA[ + if (this.editorElement) { + this.editorElement.contentDocument.documentElement.innerHTML = this.globalFunctions.fromText2HTML(val); + } + ]]> + </setter> + </property> <method name="fillFontFace"> <body><![CDATA[ - if (gExchWebServiceLocalFonts == undefined) { + if (gExchWebServiceLocalFonts === undefined) { // Build list of all local fonts once per editor try { var enumerator = Components.classes["@mozilla.org/gfx/fontenumerator;1"] @@ -300,7 +326,7 @@ catch(e) { } } - if (gExchWebServiceLocalFonts != undefined) { + if (gExchWebServiceLocalFonts !== undefined) { var itemNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem"); itemNode.setAttribute("label", "Variable width"); @@ -323,7 +349,7 @@ ]]></body> </method> - <method name="connectButtons"> + <method name="connectAllCommandListenerToolbar"> <parameter name="aAnonId" /> <body><![CDATA[ var toolbar = document.getAnonymousElementByAttribute(this, "anonid", aAnonId); @@ -335,15 +361,15 @@ if (toolbar) { var toolbarButtons = toolbar.getElementsByTagName("xul:toolbarbutton"); for (var i=0; i<toolbarButtons.length;i++) { - if ((toolbarButtons[i].hasAttribute("connect")) && (toolbarButtons[i].getAttribute("connect") == "true")) { - this.connectButton(toolbarButtons[i].getAttribute("anonid"), aAnonId); + if ((toolbarButtons[i].hasAttribute("connect")) && (toolbarButtons[i].getAttribute("connect") === "true")) { + this.addCommandListener(toolbarButtons[i].getAttribute("anonid"), aAnonId); } } } ]]></body> </method> - <method name="connectButton"> + <method name="addCommandListener"> <parameter name="aAnonId" /> <parameter name="aStore" /> <body><![CDATA[ @@ -353,22 +379,22 @@ this.functions[aStore] = {}; } this.functions[aStore][aAnonId] = function() { self.toggleButton(aAnonId);}; - document.getAnonymousElementByAttribute(this, "anonid", aAnonId).addEventListener("command", this.functions[aStore][aAnonId], true); + document.getAnonymousElementByAttribute(this, "anonid", aAnonId).addEventListener("command", this.functions[aStore][aAnonId], false); ]]></body> </method> - <method name="disconnectButtons"> + <method name="removeAllCommandListenerToolbar"> <parameter name="aAnonId" /> <body><![CDATA[ if ((this.functions) && (this.functions[aAnonId])) { for (var name in this.functions[aAnonId]) { - this.disconnectButton(name, aAnonId); + this.removeCommandListener(name, aAnonId); } } ]]></body> </method> - <method name="disconnectButton"> + <method name="removeCommandListener"> <parameter name="aAnonId" /> <parameter name="aStore" /> <body><![CDATA[ @@ -391,10 +417,7 @@ <method name="onKeyPressEditor"> <parameter name="aEvent" /> <body><![CDATA[ -//if (aEvent) { -//dump("aEvent.keyCode:"+aEvent.keyCode+"\n"); -//} - if ( ( (aEvent.keyCode > 36) && (aEvent.keyCode < 41) ) || (aEvent.keyCode == 33) || (aEvent.keyCode == 34)) { + if ( ( (aEvent.keyCode > 36) && (aEvent.keyCode < 41) ) || (aEvent.keyCode === 33) || (aEvent.keyCode === 34)) { this.onClickEditor(aEvent); } ]]></body> @@ -405,12 +428,9 @@ <body><![CDATA[ { var href = ""; - var isKeyCommand = (event.type == "command"); + var isKeyCommand = (event.type === "command"); var linkNode = isKeyCommand ? this.editorElement.commandDispatcher.focusedElement : event.originalTarget; -//dump("event.type:"+event.type+"\n"); -//dump("event.originalTarget:"+event.originalTarget+"\n"); -//dump("linkNode:"+linkNode+"\n"); while (linkNode instanceof Element) { if (linkNode instanceof HTMLAnchorElement || linkNode instanceof HTMLAreaElement || @@ -434,7 +454,6 @@ } linkNode = linkNode.parentNode; } -//dump("href:"+href+"\n"); return href ? {href: href, linkNode: linkNode} : null; } ]]></body> @@ -482,27 +501,27 @@ } var color = this.getCStringCommandState("cmd_fontColor", this.commandManager, this.editorElement.contentWindow, "state_attribute"); - if (color == "") { + if (color === "") { color = "transparent"; } else { color = this.ConvertRGBColorIntoHEXColor(color); } document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor").setAttribute("style","background-color:"+color); - + var aFirst = { value: false }; var aAny = { value: false }; var aAll = { value: false }; var propAtom = this.atomService.getAtom("font"); var edElement = this.editorElement.getHTMLEditor(this.editorElement.contentWindow); - color = edElement.getInlinePropertyWithAttrValue(propAtom, "bgcolor", null, aFirst, aAny, aAll); + color = edElement.getInlinePropertyWithAttrValue(propAtom, "bgcolor", null, aFirst, aAny, aAll); document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor").setAttribute("style","background-color:"+color); var font = this.getCStringCommandState("cmd_fontFace", this.commandManager, this.editorElement.contentWindow, "state_attribute"); font = font.replace(/"/g, ""); var fontElement; - if (font.indexOf(",") > -1) { + if (font.indexOf(",") !== -1) { var fonts = font.split(","); for(var i = 0; ((i<fonts.length) && (!fontElement)); i++) { fontElement = document.getAnonymousElementByAttribute(this, "label", fonts[i]); @@ -577,7 +596,7 @@ // Get current color var color = this.getCStringCommandState(aAnonId, this.commandManager, this.editorElement.contentWindow, "state_attribute"); - if (color == "") { + if (color === "") { color = "transparent"; } else { @@ -594,7 +613,7 @@ element.setAttribute("style","background-color:"+colorObj.TextColor); - if (aAnonId == "cmd_fontColor") { + if (aAnonId === "cmd_fontColor") { var state = Components.classes["@mozilla.org/embedcomp/command-params;1"] .createInstance(Components.interfaces.nsICommandParams); state.setCStringValue("state_attribute", colorObj.TextColor); @@ -614,11 +633,20 @@ <body><![CDATA[ if ( /rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/.test(color) ) { var r = Number(RegExp.$1).toString(16); - if (r.length == 1) r = "0"+r; + if (r.length === 1){ + r = "0"+r; + } + var g = Number(RegExp.$2).toString(16); - if (g.length == 1) g = "0"+g; + if (g.length === 1) { + g = "0"+g; + } + var b = Number(RegExp.$3).toString(16); - if (b.length == 1) b = "0"+b; + if (b.length === 1) { + b = "0"+b; + } + return "#"+r+g+b; } else @@ -662,7 +690,7 @@ if (this.commandManager) { var button = document.getAnonymousElementByAttribute(this, "anonid", aAnonId); if (button.hasAttribute("state")) { - if (aAnonId.indexOf("cmd_align") > -1) { + if (aAnonId.indexOf("cmd_align") !== -1) { button.checked = (aAnonId.indexOf(this.getCStringCommandState("cmd_align", this.commandManager, this.editorElement.contentWindow, "state_attribute")) > 0); } else { @@ -676,7 +704,7 @@ <parameter name="aAnonId" /> <body><![CDATA[ if (this.commandManager) { - if (aAnonId.indexOf("cmd_align") > -1) { + if (aAnonId.indexOf("cmd_align") !== -1) { var state = Components.classes["@mozilla.org/embedcomp/command-params;1"] .createInstance(Components.interfaces.nsICommandParams); state.setCStringValue("state_attribute", aAnonId.substr(10)); @@ -685,7 +713,7 @@ else { this.commandManager.doCommand(aAnonId, null, null); } -// this.setButtonState(aAnonId); + this.onClickEditor(); } ]]></body> @@ -693,35 +721,31 @@ <method name="addLink"> <body><![CDATA[ -//dump("addLink\n"); + var result = window.prompt("Link URL:", "http://"); if (result) { var selObj = this.editorElement.contentDocument.getSelection(); -//dump("selObj.rangeCount:"+selObj.rangeCount+"\n"); + var range = selObj.getRangeAt(0); var textElement = range.startContainer; var parent = textElement.parentElement; -//dump("parent:"+parent+"\n"); + var startOffset = range.startOffset; -//dump("1. parent.outerHTML:"+parent.outerHTML+"\n"); -//dump("range.startOffset:"+range.startOffset+"\n"); var newLink = document.createElement("a"); newLink.setAttribute("href", result); range.surroundContents(newLink); -//dump("newLink.outerHTML:"+newLink.outerHTML+"\n"); var splitText = textElement.splitText(startOffset); parent.insertBefore(newLink, splitText); this.content = this.content; -//dump("2. parent.outerHTML:"+parent.outerHTML+"\n"); } ]]></body> </method> <method name="removeLink"> <body><![CDATA[ -//dump("removeLink\n"); + if (this.ceParams) { var parent = this.ceParams.linkNode.parentElement; while (this.ceParams.linkNode.firstChild) { @@ -734,7 +758,7 @@ <method name="editLink"> <body><![CDATA[ -//dump("editLink\n"); + if (this.ceParams) { var result = window.prompt("Link URL:", this.ceParams.href); if (result) { diff -Nru calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.js calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.js --- calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.js 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.js 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,324 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: GPL 3.0 + * + * The contents of this file are subject to the General Public License + * 3.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.gnu.org/licenses/gpl.html + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * -- Exchange 2007/2010 Calendar and Tasks Provider. + * -- For Thunderbird with the Lightning add-on. + * + * Author: Michel Verbraak (info@1st-setup.nl) + * Website: http://www.1st-setup.nl/wordpress/?page_id=133 + * email: exchangecalendar@extensions.1st-setup.nl + * + * + * This code uses parts of the Microsoft Exchange Calendar Provider code on which the + * "Exchange Data Provider for Lightning" was based. + * The Initial Developer of the Microsoft Exchange Calendar Provider Code is + * Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London + * Portions created by the Initial Developer are Copyright (C) 2009 + * the Initial Developer. All Rights Reserved. + * + * ***** BEGIN LICENSE BLOCK *****/ +var Cu = Components.utils; +var Ci = Components.interfaces; +var Cc = Components.classes; + +Cu.import("resource://calendar/modules/calUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); + +function exchangeEventDialog(aDocument, aWindow) +{ + this._document = aDocument; + this._window = aWindow; + + this.globalFunctions = Cc["@1st-setup.nl/global/functions;1"] + .getService(Ci.mivFunctions); +} + +exchangeEventDialog.prototype = { + _initialized: false, + _oldCallback: null, + + /* + * onAcceptCallback: read caller content to save extra information if caller was exchangecalendar + */ + onAcceptCallback: function _onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing) + { + if (aCalendar.type === "exchangecalendar") { + if (cal.isEvent(aItem)) { + if (!aItem.className) { + var newItem = Cc["@1st-setup.nl/exchange/calendarevent;1"] + .createInstance(Ci.mivExchangeEvent); + newItem.cloneToCalEvent(aItem); + aItem = newItem; + } + } + else { + // Save extra exchange fields to item. + if (!aItem.className) { + var newItem = Cc["@1st-setup.nl/exchange/calendartodo;1"] + .createInstance(Ci.mivExchangeTodo); + newItem.cloneToCalEvent(aItem); + aItem = newItem; + } + + aItem.totalWork = this._document.getElementById("exchWebService-totalWork-count").value; + aItem.actualWork = this._document.getElementById("exchWebService-actualWork-count").value; + aItem.mileage = this._document.getElementById("exchWebService-mileage-count").value; + aItem.billingInformation = this._document.getElementById("exchWebService-billingInformation-count").value; + aItem.companies = this._document.getElementById("exchWebService-companies-count").value; + } + + // Copy content from HTML editor + try{ + if (this.newItem) { + aItem.bodyType = "HTML"; + aItem.body = this._document.getElementById("exchWebService-body-editor").content; + this.newItem = false; + } + else if (aItem.bodyType === "HTML") { + aItem.body = this._document.getElementById("exchWebService-body-editor").content; + } + } catch(err) { + dump("Error saving content\n"); + } + } + + if (this._oldCallback) { + this._oldCallback(aItem, aCalendar, aOriginalItem, aIsClosing); + } + }, + + /* + * Update repeat informations on Exchange tasks + */ + updateRepeat: function _updateRepeat() + { + var repeatDetails = this._document.getElementById("repeat-details").childNodes; + if (repeatDetails.length === 3) { + this._document.getElementById("repeat-details").removeChild(repeatDetails[2]); + var toolTip = repeatDetails[0].getAttribute("tooltiptext"); + var tmpArray = toolTip.split("\n"); + tmpArray.splice(2,1); + repeatDetails[0].setAttribute("tooltiptext", tmpArray.join("\n")); + repeatDetails[1].setAttribute("tooltiptext", tmpArray.join("\n")); + } + }, + + /* + * Adds HTML editor for exchangecalendar items + * Adds extra informations for Exchange tasks + * + * As the same dialog is used for non-Exchange tasks and for events, this function + * removes too these details when necessary. + */ + updateScreen: function _updateScreen(aItem, aCalendar) + { + var item = aItem; + + if (aCalendar.type === "exchangecalendar") { + + // For all item type, enable HTML editor + + // Set HTML content editor + let itemBodyEditor = this._document.getElementById("exchWebService-body-editor"); + + // Try to read directly item body, otherwise fallback to item description property + if (item.body) { + itemBodyEditor.content = item.body; + + // As this dialog set the bodyType, we check it to know if it's a new Item or not + this.newItem = item.bodyType.toLowerCase() !== "html"; + } + else { + this.newItem = true; + itemBodyEditor.content = item.getProperty("DESCRIPTION"); + } + + // Display HTML content editor + if (item.bodyType === undefined // item is not already defined + || item.bodyType.toLowerCase() === "html" // current item contains HTML + ) { + // Hidde original item description editor + this._document.getElementById("item-description").hidden = true; + + // Display our own HTML content editor + itemBodyEditor.setAttribute("collapsed", "false");; + + itemBodyEditor.setAttribute("scrollbars","yes"); + } + + // If not an event, add Exchange task extra informations + if (!cal.isEvent(item)) { + + // Set and display task owner + + var ownerLabel = this._document.getElementById("exchWebService-owner-label"); + if (ownerLabel) { + ownerLabel.setAttribute("collapsed", "false"); + ownerLabel.value = item.owner; + } + + // Set and display Exchange task details + + this._document.getElementById("exchWebService-details-separator").hidden = false; + this._document.getElementById("exchWebService-details-row1").collapsed = false; + this._document.getElementById("exchWebService-details-row2").collapsed = false; + this._document.getElementById("exchWebService-details-row3").collapsed = false; + + if (item.className) { + this._document.getElementById("exchWebService-totalWork-count").value = item.totalWork; + this._document.getElementById("exchWebService-actualWork-count").value = item.actualWork; + this._document.getElementById("exchWebService-mileage-count").value = item.mileage; + this._document.getElementById("exchWebService-billingInformation-count").value = item.billingInformation; + this._document.getElementById("exchWebService-companies-count").value = item.companies; + } + + // Remove some standard inputs + + this._document.getElementById("event-grid-location-row").hidden = true; + + this._document.getElementById("reminder-none-separator").hidden = true; + this._document.getElementById("reminder-0minutes-menuitem").hidden = true; + this._document.getElementById("reminder-5minutes-menuitem").hidden = true; + this._document.getElementById("reminder-15minutes-menuitem").hidden = true; + this._document.getElementById("reminder-30minutes-menuitem").hidden = true; + this._document.getElementById("reminder-minutes-separator").hidden = true; + this._document.getElementById("reminder-1hour-menuitem").hidden = true; + this._document.getElementById("reminder-2hours-menuitem").hidden = true; + this._document.getElementById("reminder-12hours-menuitem").hidden = true; + this._document.getElementById("reminder-hours-separator").hidden = true; + this._document.getElementById("reminder-1day-menuitem").hidden = true; + this._document.getElementById("reminder-2days-menuitem").hidden = true; + this._document.getElementById("reminder-1week-menuitem").hidden = true; + + this._document.getElementById("timezone-starttime").hidden = true; + this._document.getElementById("timezone-endtime").hidden = true; + + // Manage repeat for Exchange tasks + + if (this._document.getElementById("item-repeat")) { + this._document.getElementById("item-repeat").addEventListener("command", function() { self.updateRepeat(); }, false); + } + + this.updateRepeat(); + } + } + + // For events and other calendar type, hidde back all Exchange task details, display back standard items + if (cal.isEvent(item) + || cal.type !== "exchangecalendar") { + + // Hide Exchange task details + + // Task owner + this._document.getElementById("exchWebService-owner-row").setAttribute("collapsed", "true"); + + // Task details + this._document.getElementById("exchWebService-details-separator").hidden = true; + this._document.getElementById("exchWebService-details-row1").collapsed = true; + this._document.getElementById("exchWebService-details-row2").collapsed = true; + this._document.getElementById("exchWebService-details-row3").collapsed = true; + + // Reset standard form + this._document.getElementById("event-grid-location-row").hidden = false; + this._document.getElementById("event-grid-recurrence-row").hidden=false; + + // Reset reminder select list for todo + this._document.getElementById("reminder-none-separator").hidden = false; + this._document.getElementById("reminder-0minutes-menuitem").hidden = false; + this._document.getElementById("reminder-5minutes-menuitem").hidden = false; + this._document.getElementById("reminder-15minutes-menuitem").hidden = false; + this._document.getElementById("reminder-30minutes-menuitem").hidden = false; + this._document.getElementById("reminder-minutes-separator").hidden = false; + this._document.getElementById("reminder-1hour-menuitem").hidden = false; + this._document.getElementById("reminder-2hours-menuitem").hidden = false; + this._document.getElementById("reminder-12hours-menuitem").hidden = false; + this._document.getElementById("reminder-hours-separator").hidden = false; + this._document.getElementById("reminder-1day-menuitem").hidden = false; + this._document.getElementById("reminder-2days-menuitem").hidden = false; + this._document.getElementById("reminder-1week-menuitem").hidden = false; + + // Reset timezone start/end time + this._document.getElementById("timezone-starttime").hidden = false; + this._document.getElementById("timezone-endtime").hidden = false; + } + + // Reset content editor when not exchangecalendar items + if (aCalendar.type !== "exchangecalendar") { + // Hidde HTML content editor + this._document.getElementById("item-description").hidden = false; + this._document.getElementById("exchWebService-body-editor").setAttribute("collapsed", "true"); + } + }, + + + /** + * Receives asynchronous messages from the parent context that contains the iframe. + * + * @param {MessageEvent} aEvent Contains the message being received + */ + receiveMessage: function _receiveMessage(aEvent) { + let validOrigin = gTabmail ? "chrome://messenger" : "chrome://calendar"; + if (aEvent.origin !== validOrigin) { + return; + } + switch (aEvent.data.command) { + //case "exchWebService_addAttachmentDialog": this.addAttachmentDialog(); break; + } + }, + + /* + * onLoad: setup event dialog window + * - Update screen according to type of item (task / event) + * - Add callback (once) + **/ + onLoad: function _onLoad() + { + // Update screen according to task / event + let item = this._window.calendarItem; + this.updateScreen(item, item.calendar); + + if (this._initialized) { + return; + } + + var self = this; + + // Override dialog callback to add extra exchangecalendar information processing + this._oldCallback = this._window.onAcceptCallback; + this._window.onAcceptCallback = function(aItem, aCalendar, aOriginalItem, aIsClosing) { + self.onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing); + }; + + // Add message listener to be able to receive message from parent window or tab + window.addEventListener("message", function(aEvent) { self.receiveMessage(aEvent); }, false); + + this._initialized = true; + }, + + /* + * selectedCalendarChanged: modify event-dialog to add extra exchangecalendar info when an exchange calendar is selected + */ + selectedCalendarChanged: function _selectedCalendarChanged(aMenuList) + { + updateCalendar(); + + this.updateScreen(this._window.calendarItem, getCurrentCalendar()); + } +} + + +var exchToolsEventDialog = new exchangeEventDialog(document, window); + +// Add our loader to update dialog window with Exchange extra widgets if needed +window.addEventListener("load", function () { exchToolsEventDialog.onLoad(); }, false); + diff -Nru calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.xul calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.xul --- calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.xul 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.xul 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* ***** BEGIN LICENSE BLOCK ***** + * Version: GPL 3.0 + * + * The contents of this file are subject to the General Public License + * 3.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.gnu.org/licenses/gpl.html + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * ## Exchange 2007/2010 Calendar and Tasks Provider. + * ## For Thunderbird with the Lightning add-on. + * + * Author: Michel Verbraak (info@1st-setup.nl) + * Website: http://www.1st-setup.nl/wordpress/?page_id=133 + * email: exchangecalendar@extensions.1st-setup.nl + * + * + * This code uses parts of the Microsoft Exchange Calendar Provider code on which the + * "Exchange Data Provider for Lightning" was based. + * The Initial Developer of the Microsoft Exchange Calendar Provider Code is + * Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London + * Portions created by the Initial Developer are Copyright (C) 2009 + * the Initial Developer. All Rights Reserved. + * + * ***** BEGIN LICENSE BLOCK *****/ +--> + +<!-- CSS for the HTML content editor --> +<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/itemBodyEditor.css"?> +<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/exchWebServiceEditor.css"?> + +<!-- Attachment overlay --> +<?xul-overlay href="chrome://exchangecalendar/content/attachments-view.xul"?> + +<!DOCTYPE dialog [ + +<!ENTITY % eventDialogDTD SYSTEM "chrome://calendar/locale/calendar-event-dialog.dtd"> + %eventDialogDTD; + +<!ENTITY % dtd1 SYSTEM "chrome://exchangecalendar/locale/lightning-item-iframe.dtd" > + %dtd1; +]> + +<overlay id="exchangecalendar-lightning-item-iframe.xul" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + + <!-- Manage special Exchange items and provide attendee speicific dialog --> + <script type="application/javascript" src="chrome://exchangecalendar/content/lightning-item-iframe.js"/> + + <!-- These rows correspond to the full form under the toolbar --> + <rows id="event-grid-rows"> + <!-- If the current element is a Task and is an Exchange one, add a label to show the current owner of the task. --> + <row id="exchWebService-owner-row" + insertafter="event-grid-title-row" + align="center" + collapsed="true" > + <label value="&exchWebService.owner.label;" /> + <label id="exchWebService-owner-label" + value="" /> + </row> + + <!-- When other calendar is selected, we have to clean the current dialog if the new calendar is not an Exchange one --> + <row id="event-grid-category-color-row"> + <hbox id="event-grid-category-box"> + <menulist id="item-calendar" + oncommand="exchToolsEventDialog.selectedCalendarChanged(this); tmpAttachment.selectedCalendarChanged(this);" /> + </hbox> + </row> + + <!-- Exchange task details (hidden by defaults, displayed only by javascript) --> + <separator id="exchWebService-details-separator" + insertafter="event-grid-todo-status-row" + class="groove" + hidden="true" /> + + <row id="exchWebService-details-row1" + insertafter="exchWebService-details-separator" + align="center" + collapsed="true" > + <label value="&exchWebService.totalWork.label;" + disable-on-readonly="true" /> + + <hbox align="center"> + <textbox id="exchWebService-totalWork-count" + type="number" increment="10" min="0" size="3" + value="0" + disable-on-readonly="true" /> + + <label value="&exchWebService.mileage.label;" + disable-on-readonly="true" /> + <textbox id="exchWebService-mileage-count" value="" + disable-on-readonly="true"/> + </hbox> + </row> + + <row id="exchWebService-details-row2" + insertafter="exchWebService-details-row1" + align="center" + collapsed="true" > + <label value="&exchWebService.actualWork.label;" + disable-on-readonly="true" /> + + <hbox align="center"> + <textbox id="exchWebService-actualWork-count" + type="number" increment="10" min="0" size="3" + value="0" + disable-on-readonly="true" /> + + <label value="&exchWebService.billingInformation.label;" + disable-on-readonly="true"/> + <textbox id="exchWebService-billingInformation-count" + value="" + disable-on-readonly="true"/> + </hbox> + </row> + + <row id="exchWebService-details-row3" + insertafter="exchWebService-details-row2" + align="center" + collapsed="true" > + <label value="&exchWebService.companies.label;" + disable-on-readonly="true"/> + <textbox id="exchWebService-companies-count" + value="" + disable-on-readonly="true"/> + </row> + </rows> + + <tabbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + id="event-grid-tabbox"> + + <tabpanels id="event-grid-tabpanels"> + <!-- Add HTML text editor for Exchange tasks --> + <tabpanel id="event-grid-tabpanel-description"> + <itemBodyEditor id="exchWebService-body-editor" + flex="1" + insertafter="item-description" + disable-on-readonly="true" + collapsed="true"/> + </tabpanel> + + </tabpanels> + </tabbox> + +</overlay> diff -Nru calendar-exchange-provider-3.9.0/chrome/content/msgHdrUtils.js calendar-exchange-provider-4.0.0~beta4/chrome/content/msgHdrUtils.js --- calendar-exchange-provider-3.9.0/chrome/content/msgHdrUtils.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/content/msgHdrUtils.js 2017-07-03 22:10:10.000000000 +0200 @@ -208,18 +208,16 @@ function msgHdrSetTags (aMsgHdr, aTags) { let oldTagList = msgHdrGetTags(aMsgHdr); let oldTags = {}; // hashmap - for each (let [, tag] in Iterator(oldTagList)) + for (let tag of oldTagList) oldTags[tag.key] = null; let newTags = {}; let newTagList = aTags; - for each (let [, tag] in Iterator(newTagList)) + for (let tag of newTagList) newTags[tag.key] = null; - let toAdd = [x.key for each ([, x] in Iterator(newTagList)) - if (!(x.key in oldTags))]; - let toRemove = [x.key for each ([, x] in Iterator(oldTagList)) - if (!(x.key in newTags))]; + let toAdd = newTagList.filter( tag => !(tag.key in oldTags)); + let toRemove = oldTagList.filter( tag => !(tag.key in newTags)); let folder = aMsgHdr.folder; let msgHdr = toXPCOMArray([aMsgHdr], Ci.nsIMutableArray); diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/mac/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/mac/attachments-view.css --- calendar-exchange-provider-3.9.0/chrome/skins/mac/attachments-view.css 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/mac/attachments-view.css 2017-07-03 22:10:10.000000000 +0200 @@ -1,22 +1,20 @@ -#exchWebService-add-attachment-button { - -moz-image-region: rect(0px 96px 24px 72px); -} -#exchWebService-add-attachment-button[disabled="true"], -#exchWebService-add-attachment-button[disabled="true"]:hover { - -moz-image-region: rect(48px 96px 72px 72px); -} -#exchWebService-add-attachment-button:hover { - -moz-image-region: rect(24px 96px 48px 72px); -} +/* + * Should be synced with chrome://calendar/skin/calendar-event-dialog.css + * especially the #button-url rules (as it displays the attachment icon) + */ -toolbar[iconsize="small"] #exchWebService-add-attachment-button { - -moz-image-region: rect(0px 64px 16px 48px); +@media not all and (-moz-mac-yosemite-theme) { + #exchWebService-add-attachment-button { + list-style-image: url(chrome://calendar-common/skin/calendar-toolbar-osxlion.svg#attach); + } } -toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"], -toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"]:hover { - -moz-image-region: rect(32px 64px 48px 48px); -} -toolbar[iconsize="small"] #exchWebService-add-attachment-button:hover { - -moz-image-region: rect(16px 64px 32px 48px); + +@media (-moz-mac-yosemite-theme) { + #exchWebService-add-attachment-button { + list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach); + } + +toolbar[brighttext] #exchWebService-add-attachment-button { + list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted); } diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/unix/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/unix/attachments-view.css --- calendar-exchange-provider-3.9.0/chrome/skins/unix/attachments-view.css 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/unix/attachments-view.css 2017-07-03 22:10:10.000000000 +0200 @@ -1,21 +1,13 @@ -#exchWebService-add-attachment-button { - -moz-image-region: rect(0px 96px 24px 72px); -} -#exchWebService-add-attachment-button[disabled="true"], -#exchWebService-add-attachment-button[disabled="true"]:hover { - -moz-image-region: rect(48px 96px 72px 72px); -} -#exchWebService-add-attachment-button:hover { - -moz-image-region: rect(24px 96px 48px 72px); -} +/* + * Should be synced with chrome://calendar/skin/calendar-event-dialog.css + * especially the #button-url rules (as it displays the attachment icon) + */ -toolbar[iconsize="small"] #exchWebService-add-attachment-button { - -moz-image-region: rect(0px 64px 16px 48px); +#exchWebService-add-attachment-button { + list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach); } -toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"], -toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"]:hover { - -moz-image-region: rect(32px 64px 48px 48px); -} -toolbar[iconsize="small"] #exchWebService-add-attachment-button:hover { - -moz-image-region: rect(16px 64px 32px 48px); + +toolbar[brighttext] #exchWebService-add-attachment-button { + list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted); } + diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/win/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/win/attachments-view.css --- calendar-exchange-provider-3.9.0/chrome/skins/win/attachments-view.css 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/win/attachments-view.css 2017-07-03 22:10:10.000000000 +0200 @@ -1,21 +1,13 @@ -#exchWebService-add-attachment-button { - -moz-image-region: rect(0px 96px 24px 72px); -} -#exchWebService-add-attachment-button[disabled="true"], -#exchWebService-add-attachment-button[disabled="true"]:hover { - -moz-image-region: rect(48px 96px 72px 72px); -} -#exchWebService-add-attachment-button:hover { - -moz-image-region: rect(24px 96px 48px 72px); -} +/* + * Should be synced with chrome://calendar/skin/calendar-event-dialog.css + * especially the #button-url rules (as it displays the attachment icon) + */ -toolbar[iconsize="small"] #exchWebService-add-attachment-button { - -moz-image-region: rect(0px 64px 16px 48px); +#exchWebService-add-attachment-button { + list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach); } -toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"], -toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"]:hover { - -moz-image-region: rect(32px 64px 48px 48px); + +toolbar[brighttext] #exchWebService-add-attachment-button { + list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted); } -toolbar[iconsize="small"] #exchWebService-add-attachment-button:hover { - -moz-image-region: rect(16px 64px 32px 48px); -} \ Kein Zeilenumbruch am Dateiende. + diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/winaero/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/winaero/attachments-view.css --- calendar-exchange-provider-3.9.0/chrome/skins/winaero/attachments-view.css 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/winaero/attachments-view.css 2017-07-03 22:10:10.000000000 +0200 @@ -1,3 +1,13 @@ -#exchWebService-add-attachment-button { - -moz-image-region: rect(1px 71px 17px 55px); +/* + * Should be synced with chrome://calendar/skin/calendar-event-dialog.css + * especially the #button-url rules (as it displays the attachment icon) + */ + +#exchWebService-add-attachment-button { + list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach); } + +toolbar[brighttext] #exchWebService-add-attachment-button { + list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted); +} + diff -Nru calendar-exchange-provider-3.9.0/chrome.manifest calendar-exchange-provider-4.0.0~beta4/chrome.manifest --- calendar-exchange-provider-3.9.0/chrome.manifest 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/chrome.manifest 2017-07-03 22:10:10.000000000 +0200 @@ -12,10 +12,14 @@ overlay chrome://messenger/content/messenger.xul chrome://exchangecalendar/content/progress_panel.xul overlay chrome://calendar/content/calendar-task-view.xul chrome://exchangecalendar/content/messenger_task_delegation.xul overlay chrome://lightning/content/lightning-standalone.xul chrome://exchangecalendar/content/progress_panel.xul + overlay chrome://calendar/content/calendar-event-dialog.xul chrome://exchangecalendar/content/calendar-event-dialog.xul +overlay chrome://lightning/content/lightning-item-iframe.xul chrome://exchangecalendar/content/lightning-item-iframe.xul + overlay chrome://calendar/content/calendar-event-dialog-reminder.xul chrome://exchangecalendar/content/calendar-event-dialog-reminder.xul overlay chrome://calendar/content/calendar-summary-dialog.xul chrome://exchangecalendar/content/calendar-summary-dialog.xul overlay chrome://calendar/content/calendar-properties-dialog.xul chrome://exchangecalendar/content/calendar-properties-dialog.xul + overlay chrome://messenger/content/messenger.xul chrome://exchangecalendar/content/sharedCalendarParser.xul application={3550f703-e582-4d05-9a08-453d09bdfdc6} overlay chrome://messenger/content/messenger.xul chrome://exchangecalendar/content/check4lightning.xul overlay chrome://messenger/content/preferences/preferences.xul chrome://exchangecalendar/content/messenger-overlay-preferences.xul @@ -46,6 +50,8 @@ locale exchangecalendar ja-JP locale/exchangecalendar/ja-JP/ locale exchangecalendar sv locale/exchangecalendar/sv/ locale exchangecalendar ru locale/exchangecalendar/ru/ +locale exchangecalendar it-IT locale/exchangecalendar/it-IT/ +locale exchangecalendar tr locale/exchangecalendar/tr/ manifest interfaces/exchangeCalendar/mivExchangeCalendar.manifest diff -Nru calendar-exchange-provider-3.9.0/components/accountFunctions.js calendar-exchange-provider-4.0.0~beta4/components/accountFunctions.js --- calendar-exchange-provider-3.9.0/components/accountFunctions.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/components/accountFunctions.js 1970-01-01 01:00:00.000000000 +0100 @@ -1,173 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: GPL 3.0 - * - * The contents of this file are subject to the General Public License - * 3.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.gnu.org/licenses/gpl.html - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * -- Global Functions for Exchange Calendar and Exchange Contacts. - * -- For Thunderbird. - * - * Author: Michel Verbraak (info@1st-setup.nl) - * Website: http://www.1st-setup.nl/wordpress/?page_id=133 - * email: info@1st-setup.nl - * - * - * ***** BEGIN LICENSE BLOCK *****/ - -var Cc = Components.classes; -var Ci = Components.interfaces; -var Cu = Components.utils; -var Cr = Components.results; -var components = Components; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource:///modules/Services.jsm"); -Cu.import("resource://exchangecalendar/ecFunctions.js"); - -var EXPORTED_SYMBOLS = []; - -if (! exchWebService) var exchWebService = {}; - -exchWebService.accountFunctions = { - - prefs: Cc["@mozilla.org/preferences-service;1"] - .getService(Ci.nsIPrefService) - .getBranch("extensions.exchangeWebServices.accounts."), - - logInfo: function _logInfo(message) - { - exchWebService.commonFunctions.LOG("[exchWebService.accountFunctions] "+message + " ("+exchWebService.commonFunctions.STACKshort()+")"); - }, - - getAccountIds: function _getAccountIds() - { - var ids = exchWebService.commonFunctions.safeGetCharPref(this.prefs, "ids", ""); - this.logInfo("ids:"+ids); - return ids.split(","); - }, - - getAccounts: function _getAccounts() - { - var result = {}; - var ids = this.getAccountIds() - for (var index in ids) { - - if (ids[index] != "") { - this.logInfo("id:"+ids[index]); - result[ids[index]] = {}; - this.getAccountById(ids[index], result[ids[index]]); - } - } - - return result; - }, - - getAccountById: function _getAccountById(aId, aAccount) - { - var result = false; - - this.logInfo("id:"+aId); - var children = this.prefs.getChildList(aId+".",{}); - if (children.length > 0) { - result = true; - aAccount["id"] = aId; - for (var index in children) { - var attribute = children[index].substr(children[index].indexOf(".")+1); - switch (this.prefs.getPrefType(children[index])) { - case this.prefs.PREF_STRING: - aAccount[attribute] = this.prefs.getCharPref(children[index]); - break; - case this.prefs.PREF_INT: - aAccount[attribute] = this.prefs.getIntPref(children[index]); - break; - case this.prefs.PREF_BOOL: - aAccount[attribute] = this.prefs.getBoolPref(children[index]); - break; - } - } - } - - return result; - }, - - getAccountByServer: function _getAccountByServer(aServer) - { - var accounts = this.getAccounts(); - var account = null; - for (var index in accounts) { - if ((accounts[index].server) && (accounts[index].server.toLowerCase() == aServer.toLowerCase())) { - return accounts[index]; - } - } - }, - - saveAccount: function _saveAccount(aAccount) - { - for (var index in aAccount) { - switch (typeof(aAccount[index])) { - case "string": - this.prefs.setCharPref(aAccount.id+"."+index, aAccount[index]); - break; - case "number": - this.prefs.setIntPref(aAccount.id+"."+index, aAccount[index]); - break; - default: - this.logInfo("Unknown object index:"+index); - } - } - - // Check if the ids all ready exists. If not add it. - var ids = this.getAccountIds(); - var idExists = false; - for (var index in ids) { - if (ids[index] == aAccount.id) { - idExists = true; - break; - } - } - if (!idExists) { - ids.push(aAccount.id); - ids = ids.join(","); - this.prefs.setCharPref("ids", ids); - } - }, - - removeAccount: function _removeAccount(aAccount) - { - if (aAccount.id) { - this.removeAccountById(aAccount.id); - } - }, - - removeAccountById: function _removeAccountById(aAccountId) - { - this.prefs.deleteBranch(aAccountId); - // Remove from ids list. - var oldIds = this.getAccountIds(); - var newIds = []; - for (var index in oldIds) { - if (oldIds[index] != aAccountId) { - newIds.push(oldIds[index]); - } - } - - if (newIds.length > 0) { - newIds = newIds.join(","); - } - else { - newIds = ""; - } - this.prefs.setCharPref("ids", newIds); - }, - - -} - - diff -Nru calendar-exchange-provider-3.9.0/components/ecExchangeRequest.js calendar-exchange-provider-4.0.0~beta4/components/ecExchangeRequest.js --- calendar-exchange-provider-3.9.0/components/ecExchangeRequest.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/components/ecExchangeRequest.js 2017-07-03 22:10:10.000000000 +0200 @@ -66,7 +66,9 @@ var gExchangeRequestVersion = "0.1"; -if (! exchWebService) var exchWebService = {}; +if (! exchWebService) { + var exchWebService = {}; +} exchWebService.prePasswords = {}; @@ -87,10 +89,10 @@ this.shutdown = false; this.badCert = false; this.badCertCount = 0; - this._notificationCallbacks = null; + this.channelCallbackEcAuthPrompt2 = null; this.globalFunctions = Cc["@1st-setup.nl/global/functions;1"] - .getService(Ci.mivFunctions); + .getService(Ci.mivFunctions); this.uuid = this.globalFunctions.getUUID(); @@ -99,22 +101,22 @@ this.kerberos = true; this.prefB = Cc["@mozilla.org/preferences-service;1"] - .getService(Ci.nsIPrefBranch); + .getService(Ci.nsIPrefBranch); this.exchangeStatistics = Cc["@1st-setup.nl/exchange/statistics;1"] - .getService(Ci.mivExchangeStatistics); + .getService(Ci.mivExchangeStatistics); this.exchangeBadCertListener2 = Cc["@1st-setup.nl/exchange/badcertlistener2;1"] - .getService(Ci.mivExchangeBadCertListener2); + .getService(Ci.mivExchangeBadCertListener2); - this.observerService = Cc["@mozilla.org/observer-service;1"] - .getService(Ci.nsIObserverService); + this.observerService = Cc["@mozilla.org/observer-service;1"] + .getService(Ci.nsIObserverService); + this.observerService.addObserver(this, "http-on-modify-request", true); this.timeZones = Cc["@1st-setup.nl/exchange/timezones;1"] - .getService(Ci.mivExchangeTimeZones); - - this.xml2json = false; + .getService(Ci.mivExchangeTimeZones); + this.xml2json = false; } ExchangeRequest.prototype = { @@ -156,9 +158,42 @@ ERR_PASSWORD_ERROR: -300, // To many password errors. + QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]), + + /* + In Mozilla bug 1221320, changes were done to XMLHttpRequest so that the authPrompt dialog only appears + if neither username nor password is set in the request URL. So you only asyncPromptAuth called when both + are blank. But Exchange calendar sets a username on the first authentication attempt (supporting Basic + and Kerberos), expecting a callback to asyncPromptAuth if that fails, which it does for NTLM. + + Further changes to authentication are all controlled through these asyncPromptAuth calls which never occur, hence failure. What we + do with the observer is reverse the effect of that bug, adding back the calls to asyncPromptAuth + */ + observe(aSubject, aTopic, aData) { + let channel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel); + this.logInfo("ecExchangeRequest observing http-on-modify-request for URI " + channel.URI.spec + + " originalURI " + (channel.originalURI ? channel.originalURI.spec : "none")); + + // Only respond to our host + let myHost = this.xmlReq && this.xmlReq.channel && this.xmlReq.channel.URI.host; + let theirHost = channel.URI.host; + if (myHost && (myHost != theirHost)) { + this.logInfo("Host does not match, theirs: " + theirHost + " mine: " + myHost); + return; + } + + let internalChannel = channel.QueryInterface(Ci.nsIHttpChannelInternal); + if (internalChannel.blockAuthPrompt) { + this.logInfo("unblocking request"); + internalChannel.blockAuthPrompt = false; + } + else + this.logInfo("Already unblocked"); + }, + get debug() { - if ((this.debuglevel == 0) || (!this.globalFunctions.shouldLog())) { + if ((this.debuglevel === 0) || (!this.globalFunctions.shouldLog())) { return false; } @@ -172,7 +207,9 @@ logInfo: function _logInfo(aMsg, aLevel) { - if (!aLevel) aLevel = 1; + if (!aLevel) { + aLevel = 1; + } if ((this.debug) && (aLevel <= this.debuglevel)) { this.globalFunctions.LOG(this.uuid+": "+aMsg); @@ -201,137 +238,176 @@ sendRequest: function(aData, aUrl) { + // Stop process while exchangecalendar is shutted down if (this.shutdown) { return; } -// this.logInfo(": sendRequest\n"); - this.mData = aData; - this.currentUrl = ""; - - while ((!aUrl) && (this.urllist.length > 0 )) { + ////////////////////////////////// + // Looking for URL to send data // + ////////////////////////////////// + this.currentUrl = null; + + // If no URL is given, try cached next known URL + // This handle the process of AutoDiscovery while list of URLs to try is not empty + if ((!aUrl) && (this.urllist.length > 0 )) { aUrl = this.urllist[0]; this.urllist.shift(); } - if ((!aUrl) || (aUrl == "") || (aUrl == undefined)) { - this.fail(this.ER_ERROR_INVALID_URL, "No url to send request to (sendRequest)."); + // If no URL is given and we have tried every known URL, stop process + if ((!aUrl) || (aUrl === "") || (aUrl === undefined)) { + this.fail(this.ER_ERROR_INVALID_URL, + "No url to send request to (sendRequest)."); return; } - this.currentUrl = aUrl; - - if (this.exchangeBadCertListener2.userCanceledCertProblem(this.currentUrl)) { - this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled adding server certificate for url="+this.currentUrl+". Aborting this request."); + // If previously user canceled request on the "Certification issue dialog" for this URL, + // we have to not go further with this one + if (this.exchangeBadCertListener2.userCanceledCertProblem(aUrl)) { + this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, + "User previously canceled adding server certificate for url=" + aUrl + ". Aborting this request."); return; } - // remove domain part in xmlhttprequest.open call + // We found an URL to send data, save it to current process + this.currentUrl = aUrl; + + ///////////////////////////// + // Processing data to send // + ///////////////////////////// + this.mData = aData; + + ////////////////////////////////////// + // Looking for user authentications // + //////////////////////////////////// var openUser = this.mArgument.user; -/* if (openUser.indexOf("\\") > -1) { - openUser = openUser.substr(openUser.indexOf("\\")+1); - }*/ + var password = null; + + var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService( + Ci.mivExchangeAuthPrompt2); - var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(Ci.mivExchangeAuthPrompt2); if (myAuthPrompt2.getUserCanceled(this.currentUrl)) { - - this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled providing a valid password for url="+this.currentUrl+". Aborting this request."); + this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, + "User canceled providing a valid password for url=" + + this.currentUrl + ". Aborting this request."); return; } try { - var password = myAuthPrompt2.getPassword(null, openUser, this.currentUrl); -// var password = myAuthPrompt2.getPassword(null, this.mArgument.user, this.currentUrl); + password = myAuthPrompt2.getPassword(null, openUser, this.currentUrl); } catch(err) { this.logInfo(err); - this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled providing a valid password for url="+this.currentUrl+". Aborting this request."); + this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, + "User canceled providing a valid password for url=" + + this.currentUrl + ". Aborting this request."); myAuthPrompt2 = null; return; } myAuthPrompt2 = null; - this.xmlReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(); + //////////////////////////////////////////////////// + // Sending data through standard XML HTTP Request // + //////////////////////////////////////////////////// + // http://dvcs.w3.org/hg/progress/raw-file/tip/Overview.html + // https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIXMLHttpRequestEventTarget + this.xmlReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(); this.mXmlReq = this.xmlReq; - var tmp = this; - - // http://dvcs.w3.org/hg/progress/raw-file/tip/Overview.html - // https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIXMLHttpRequestEventTarget - this.xmlReq.addEventListener("loadstart", function(evt) { tmp.loadstart(evt); }, false); - this.xmlReq.addEventListener("progress", function(evt) { tmp.progress(evt); }, false); - this.xmlReq.addEventListener("error", function(evt) { tmp.error(evt); }, false); - this.xmlReq.addEventListener("abort", function(evt) { tmp.abort(evt); }, false); - this.xmlReq.addEventListener("load", function(evt) { tmp.onLoad(evt); }, false); - this.xmlReq.addEventListener("loadend", function(evt) { tmp.loadend(evt); }, false); + var currentEcRequest = this; - if (this.debug) this.logInfo(": 1 ExchangeRequest.sendRequest : user="+this.mArgument.user+", url="+this.currentUrl); + // Add listeners to the request so we have more details on the current state + this.xmlReq.addEventListener("loadstart", + function(evt) { currentEcRequest.loadstart(evt); }, + false); + this.xmlReq.addEventListener("progress", + function(evt) { currentEcRequest.progress(evt); }, + false); + this.xmlReq.addEventListener("error", + function(evt) { currentEcRequest.error(evt); }, + false); + this.xmlReq.addEventListener("abort", + function(evt) { currentEcRequest.abort(evt); }, + false); + this.xmlReq.addEventListener("load", + function(evt) { currentEcRequest.onLoad(evt); }, + false); + this.xmlReq.addEventListener("loadend", + function(evt) { currentEcRequest.loadend(evt); }, + false); - this._notificationCallbacks = new ecnsIAuthPrompt2(this); + if (this.debug) { + this.logInfo(": 1 ExchangeRequest.sendRequest : user=" + + this.mArgument.user +", url=" + this.currentUrl); + } + // Open XML HTTP Request channel we'll use to coummunicate with the server try { - -// this.xmlReq.open("POST", this.currentUrl, true); + // If a password is already known, we can try basic authentication diretcly. if (password) { if (this.debug) this.logInfo("We have a prePassword: *******"); this.xmlReq.open("POST", this.currentUrl, true, openUser, password); - - // If we have full credentials we are going to add a Basic auth header just for the case we support Basic. - var tok = openUser + ':' + password; - var basicAuthHash = btoa(tok); - this.xmlReq.setRequestHeader('Authorization', "Basic " + basicAuthHash); - - //this.xmlReq.open("POST", this.currentUrl, true, this.mArgument.user, password); } else { + // If we don't have a password, we need to reach one time the URL + // to get a NTML challenge + // TODO: check if this comment is correct this.xmlReq.open("POST", this.currentUrl, true, openUser); - //this.xmlReq.open("POST", this.currentUrl, true, this.mArgument.user); } - } catch(err) { - dump("\n ERROR sendrequest:"+err+"\n"); - if (this.debug) this.logInfo(": ERROR on ExchangeRequest.sendRequest to URL:"+this.currentUrl+". err:"+err); + if (this.debug) { + this.logInfo(": ERROR on ExchangeRequest.sendRequest to URL:" + + this.currentUrl + ". err:" + err); + } + // Try another URL if possible if (this.tryNextURL()) { return; } - this.fail(this.ER_ERROR_OPEN_FAILED,"Could not connect to specified host:"+err); + this.fail(this.ER_ERROR_OPEN_FAILED, "Could not connect to specified host:" + err); return; } + // Update HTTP Headers this.xmlReq.overrideMimeType('text/xml'); this.xmlReq.setRequestHeader("Content-Type", "text/xml"); -// this.xmlReq.setRequestHeader("User-Agent", "extensions.1st-setup.nl/" + gExchangeRequestVersion+"/username="+this.mArgument.user); this.xmlReq.setRequestHeader("User-Agent", this.globalFunctions.safeGetCharPref(this.prefB, "extensions.1st-setup.others.userAgent", "exchangecalendar@extensions.1st-setup.nl", true)); // This is required for NTLM authenticated sessions. Which is default for a default EWS install. this.xmlReq.setRequestHeader("Connection", "keep-alive"); /* set channel notifications for password processing */ - this.xmlReq.channel.notificationCallbacks = this._notificationCallbacks; + this.channelCallbackEcAuthPrompt2 = new ecnsIAuthPrompt2(this); + this.xmlReq.channel.notificationCallbacks = this.channelCallbackEcAuthPrompt2; this.xmlReq.channel.loadGroup = null; var httpChannel = this.xmlReq.channel.QueryInterface(Ci.nsIHttpChannel); - // XXX we want to preserve POST across 302 redirects TODO: This might go away because header params are copyied right now. + // XXX we want to preserve POST across 302 redirects + // TODO: This might go away because header params are copyied right now. httpChannel.redirectionLimit = 0; -try{ - httpChannel.allowPipelining = false; -} -catch(err) { - this.logInfo("sendRequest: ERROR on httpChannel.allowPipelining to err:"+err); -} - - if (this.debug) this.logInfo(": sendRequest Sending: " + this.mData+"\n", 2); + try{ + httpChannel.allowPipelining = false; + } + catch(err) { + this.logInfo("sendRequest: ERROR on httpChannel.allowPipelining to err:"+err); + } - //this.exchangeStatistics.addDataSend(this.currentUrl, this.mData.length); + if (this.debug) { + this.logInfo(": sendRequest Sending: " + this.mData+"\n", 2); + } + // Finally, send data through the channel this.xmlReq.send(this.mData); }, + /* + * loadstart: XML HTTP Request callback + */ loadstart: function _loadtstart(evt) { if (this.debug) this.logInfo(": ExchangeRequest.loadstart"); @@ -339,38 +415,65 @@ this.badCert = false; }, + /* + * loadend: XML HTTP Request callback + */ loadend: function _loadend(evt) { - if (this.debug) this.logInfo(": ExchangeRequest.loadend"); - - let xmlReq = this.mXmlReq; - - if (this.debug) this.logInfo(": ExchangeRequest.loadend :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status); - if (this.debug) this.logInfo(": ExchangeRequest.loadend :"+xmlReq.responseText,2); - + if (this.debug) { + this.logInfo(": ExchangeRequest.loadend :" + + evt.type + ", readyState:" + this.mXmlReq.readyState + + ", status:" + this.mXmlReq.status); + this.logInfo(": ExchangeRequest.loadend :" + + this.mXmlReq.responseText,2); + } }, + /* + * progress: XML HTTP Request callback + */ progress: function _progress(evt) { - if (this.debug) this.logInfo(": ExchangeRequest.progress. loaded:"+evt.loaded+", total:"+evt.total); + if (this.debug) { + this.logInfo(": ExchangeRequest.progress. loaded:" + + evt.loaded + ", total:" + evt.total); + } }, + /* + * error: XML HTTP Request callback + * Depending on error received we try to recover if possible + */ error: function _error(evt) { let xmlReq = this.mXmlReq; - if (this.debug) this.logInfo(": ExchangeRequest.error :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status+", lastStatus:"+this._notificationCallbacks.lastStatus); - if (this.debug) this.logInfo(": ExchangeRequest.error :"+xmlReq.responseText,2); - if (this.debug) this.logInfo(': xmlReq.getResponseHeader("Location") :'+xmlReq.getResponseHeader("Location"),2); + if (this.debug) { + this.logInfo(": ExchangeRequest.error :" + evt.type + + ", readyState:" + xmlReq.readyState + ", status:" + xmlReq.status + + ", lastStatus:" + this.channelCallbackEcAuthPrompt2.lastStatus); + this.logInfo(": ExchangeRequest.error :" + xmlReq.responseText, 2); + this.logInfo(': xmlReq.getResponseHeader("Location") :' + + xmlReq.getResponseHeader("Location"), 2); + } - if ((!this.shutdown) && (xmlReq.readyState == 4) && (xmlReq.status == 0)) { + ////////////////////////////////////////////////////////// + // Check if error is related to TLS certification issue // + // Connection is terminated and HTTP status is 0 (none) // + ////////////////////////////////////////////////////////// + if ((!this.shutdown) + && (xmlReq.readyState === xmlReq.DONE) + && (xmlReq.status === 0)) { this.logInfo(": ExchangeRequest.error : badCert going to check if it is a cert problem."); -try { - var result = this.exchangeBadCertListener2.checkAndSolveCertProblem(this.currentUrl); -} -catch(err){ - this.logInfo(": ExchangeRequest.error : this.exchangeBadCertListener2.checkAndSolveCertProblem Error:"+err); -} + var result = null; + + try { + result = this.exchangeBadCertListener2.checkAndSolveCertProblem(this.currentUrl); + } + catch(err) { + this.logInfo(": ExchangeRequest.error : this.exchangeBadCertListener2.checkAndSolveCertProblem Error:" + err); + } + if (result.hadProblem) { if (result.solved) { this.logInfo(": ExchangeRequest.error : badCert problem but solved. going to retry url."); @@ -386,160 +489,235 @@ } } - if (this.isHTTPRedirect(evt)) return; - - if (this.tryNextURL()) return; - - this.observerService.notifyObservers(this._notificationCallbacks, "onExchangeConnectionError", this.currentUrl+"|"+this._notificationCallbacks.lastStatus+"|"+this._notificationCallbacks.lastStatusArg); - - switch (this._notificationCallbacks.lastStatus) { - case 0x804b0003: - this.fail(this.ER_ERROR_RESOLVING_HOST, "Error resolving hostname '"+this._notificationCallbacks.lastStatusArg+"'. Did you type the right hostname. (STATUS_RESOLVING)"); - xmlReq.abort(); - if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; - return; - case 0x804b000b: - this.fail(this.ER_ERROR_RESOLVING_HOST, "Error resolving hostname '"+this._notificationCallbacks.lastStatusArg+"'. Did you type the right hostname. (STATUS_RESOLVED)"); - xmlReq.abort(); - if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; + // Stop if we are able to resolve the error following redirection or trying next URL + if (this.isHTTPRedirect(evt) || this.tryNextURL()) { return; - case 0x804b0007: - this.fail(this.ER_ERROR_CONNECTING_TO, "Error during connecting to hostname '"+this._notificationCallbacks.lastStatusArg+"'. Is the host down?. (STATUS_CONNECTING_TO)"); - xmlReq.abort(); - if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; - return; - case 0x804b0004: - this.fail(this.ER_ERROR_CONNECED_TO, "Error during connection to hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_CONNECTED_TO)"); - if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; - break; - case 0x804b0005: - this.fail(this.ER_ERROR_SENDING_TO, "Error during sending data to hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_SENDING_TO)"); - if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; - break; - case 0x804b000a: - this.fail(this.ER_ERROR_WAITING_FOR, "Error during waiting for data of hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_WAITING_FOR)"); - if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; - break; - case 0x804b0006: - this.fail(this.ER_ERROR_RECEIVING_FROM, "Error during receiving of data from hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_RECEIVING_FROM)"); - if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; - break; - default: - this.fail(this.ER_ERROR_UNKNOWN_CONNECTION, "Unknown error during communication with hostname '"+this._notificationCallbacks.lastStatusArg+"'. ("+this._notificationCallbacks.lastStatus+")"); + } + + this.observerService.notifyObservers(this.channelCallbackEcAuthPrompt2, + "onExchangeConnectionError", + this.currentUrl + "|" + this.channelCallbackEcAuthPrompt2.lastStatus + + "|" + this.channelCallbackEcAuthPrompt2.lastStatusArg); + + switch (this.channelCallbackEcAuthPrompt2.lastStatus) { + // On these status, we abort current connection, reset try counter and return + case 0x804b0003: + case 0x804b000b: + this.fail(this.ER_ERROR_RESOLVING_HOST, + "Error resolving hostname '" + + this.channelCallbackEcAuthPrompt2.lastStatusArg + + "'. Did you type the right hostname. (STATUS_RESOLVED)"); + xmlReq.abort(); + if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) { + exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; + } + return; + case 0x804b0007: + this.fail(this.ER_ERROR_CONNECTING_TO, "Error during connecting to hostname '" + + this.channelCallbackEcAuthPrompt2.lastStatusArg + + "'. Is the host down?. (STATUS_CONNECTING_TO)"); + xmlReq.abort(); + if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) { + exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; + } + return; + // On these status we just reset try counter and continue + case 0x804b0004: + this.fail(this.ER_ERROR_CONNECED_TO, "Error during connection to hostname '" + + this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_CONNECTED_TO)"); + if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) { + exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; + } + break; + case 0x804b0005: + this.fail(this.ER_ERROR_SENDING_TO, "Error during sending data to hostname '" + + this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_SENDING_TO)"); + if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) { + exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; + } + break; + case 0x804b000a: + this.fail(this.ER_ERROR_WAITING_FOR, "Error during waiting for data of hostname '" + + this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_WAITING_FOR)"); + if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) { + exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; + } + break; + case 0x804b0006: + this.fail(this.ER_ERROR_RECEIVING_FROM, "Error during receiving of data from hostname '" + + this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_RECEIVING_FROM)"); + if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) { + exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; + } + break; + // Unknown status + default: + this.fail(this.ER_ERROR_UNKNOWN_CONNECTION, "Unknown error during communication with hostname '" + + this.channelCallbackEcAuthPrompt2.lastStatusArg + + "'. (" + this.channelCallbackEcAuthPrompt2.lastStatus + ")"); } }, + /* + * abort: XML HTTP Request callback + */ abort: function _abort(evt) { - if (this.debug) this.logInfo("ExchangeRequest.abort: type:"+evt.type); - if (evt.type != "abort") { - if (this.debug) this.logInfo("ecExchangeRequest.abort: "+evt.type); + if (this.debug) { + this.logInfo("ExchangeRequest.abort: type:" + evt.type); } - dump("Abort!\n"); -// this.fail(-3, "User aborted data transfer."); }, onUserStop: function _onUserStop(aCode, aMsg) { - if (this.debug) this.logInfo("ecExchangeRequest.onUserStop: aCode:"+aCode+", aMsg:"+aMsg); + if (this.debug) { + this.logInfo("ecExchangeRequest.onUserStop: aCode:"+aCode+", aMsg:"+aMsg); + } + this.mXmlReq.abort(); this.fail(aCode, aMsg); }, + /* + * isHTTPRedirect: check if URL has bee redirected and try to go through redirection + */ isHTTPRedirect: function(evt) { let xmlReq = this.mXmlReq; - if (this.debug) this.logInfo("exchangeRequest.isHTTPRedirect.xmlReq. xmlReq.readyState:"+xmlReq.readyState+", xmlReq.status:"+xmlReq.status); - if (xmlReq.readyState != 4) + if (this.debug) { + this.logInfo("exchangeRequest.isHTTPRedirect.xmlReq. xmlReq.readyState:" + + xmlReq.readyState + ", xmlReq.status:" + xmlReq.status); + } + + if (xmlReq.readyState != xmlReq.DONE) { return false; + } + // Read status to find redirection switch (xmlReq.status) { - case 301: // Moved Permanently - case 302: // Found - case 307: // Temporary redirect (since HTTP/1.1) - if (this.debug) this.logInfo(": ExchangeRequest.redirect :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status); - - let httpChannel = xmlReq.channel.QueryInterface(Ci.nsIHttpChannel); - let loc = httpChannel.getResponseHeader("Location"); - - // The location could be a relative path - if (loc.indexOf("http") == -1) { - if (this.debug) this.logInfo("new location looks to be relative."); - if (loc.indexOf("/") == 0) { - if (this.debug) this.logInfo("Relative to the root of the server."); + case 301: // Moved Permanently + case 302: // Found + case 307: // Temporary redirect (since HTTP/1.1) + if (this.debug) { + this.logInfo(": ExchangeRequest.redirect :" + + evt.type + ", readyState:" + xmlReq.readyState + + ", status:" + xmlReq.status); + } + + // Read new location from HTTP headers + let httpChannel = xmlReq.channel.QueryInterface(Ci.nsIHttpChannel); + let loc = httpChannel.getResponseHeader("Location"); + + // The location could be a relative path + if (loc.indexOf("http") === -1) { + if (this.debug) { + this.logInfo("new location looks to be relative."); + } + // Relative to the root of the server - //Find position of third slash https://xxx/ - var slashCounter = 0; - var counter = 0; - while ((slashCounter < 3) && (counter < this.currentUrl.length)) { - if (this.currentUrl.substr(counter, 1) == "/") { - slashCounter++; - - if (slashCounter == 3) { - var tmpUrl = this.currentUrl.substr(0, counter); - break; + if (loc.indexOf("/") === 0) { + if (this.debug) { + this.logInfo("Relative to the root of the server."); + } + + // Retrieve current root path by looking for the third slash + // for the currenty requested URL (like https://xxx.yyy/) + // If there's not 3 slash, so the URL is already the root path + var rootUrlPath = null + var slashCounter = 0; + var pos = 0; + while ((slashCounter < 3) && (pos < this.currentUrl.length)) { + if (this.currentUrl.substr(pos, 1) === "/") { + slashCounter++; + + if (slashCounter === 3) { + rootUrlPath = this.currentUrl.substr(0, pos); + break; + } } + pos++; + } + + if (rootUrlPath) { + loc = rootUrlPath + loc; + } + else { + loc = this.currentUrl + loc; } - counter++; - } - if (tmpUrl) { - loc = tmpUrl + loc; } else { - loc = this.currentUrl + loc; + // Relative to last dir. + if (this.debug){ + this.logInfo("it is relative to the last dir. Currently not able to handle this."); + } } } - else { - // Relative to last dir. - if (this.debug) this.logInfo("it is relative to the last dir. Currently not able to handle this. Will be available in future version."); - } - } - if (this.debug) this.logInfo(": Redirect: " + loc + "\n"); + if (this.debug){ + this.logInfo(": Redirect: " + loc + "\n"); + } - // XXX pheer loops. - xmlReq.abort(); - this.sendRequest(this.mData, loc); + // XXX pheer loops. + xmlReq.abort(); + this.sendRequest(this.mData, loc); - return true; + // This is a redirection and we are alreday trying a new URL + return true; } + // That wasn't a redirection return false; }, - unchunk: function _unchunk(aStr) + /* + * Revert chunk process on data: + * this function take string splitted in big pieces of data + * and gather them in one big string. + */ + unchunk: function _unchunk(aChunkedString) { - var pos = aStr.indexOf("\r\n"); + var pos = aChunkedString.indexOf("\r\n"); if ((pos > -1) && (pos < 5)) { var chunkCounter = 1; - var chunkLength = parseInt(aStr.substr(0,pos), 16); + var chunkLength = parseInt(aChunkedString.substr(0,pos), 16); + if (isNaN(chunkLength)) { - if (this.debug) this.logInfo("unchunk: 1st chunk is not a number:"+aStr.substr(0,pos)); + if (this.debug){ + this.logInfo("unchunk: 1st chunk is not a number:" + aChunkedString.substr(0,pos)); + } return ""; } - if (this.debug) this.logInfo("unchunk: 1st chunk has length:"+chunkLength); - var newStr = ""; + + if (this.debug) { + this.logInfo("unchunk: 1st chunk has length:" + chunkLength); + } + + var gatheredString = ""; while (chunkLength > 0) { var bytesToCopy = chunkLength; pos = pos + 2; var charCode; while (bytesToCopy > 0) { - newStr = newStr + aStr.substr(pos, 1); - charCode = aStr.charCodeAt(pos); + gatheredString = gatheredString + aChunkedString.substr(pos, 1); + charCode = aChunkedString.charCodeAt(pos); if (charCode <= 0xFF) { bytesToCopy--; } else { if (charCode <= 0xFFFF) { - if (this.debug) this.logInfo("unchunk: TWO bytes copied '"+aStr.substr(pos, 1)+"'="+charCode); + if (this.debug) { + this.logInfo("unchunk: TWO bytes copied '" + aChunkedString.substr(pos, 1) + "'="+charCode); + } bytesToCopy = bytesToCopy - 2; } else { if (charCode <= 0xFFFFFF) { - if (this.debug) this.logInfo("unchunk: THREE bytes copied '"+aStr.substr(pos, 1)+"'="+charCode); + if (this.debug) { + this.logInfo("unchunk: THREE bytes copied '" + aChunkedString.substr(pos, 1) + "'="+charCode); + } bytesToCopy = bytesToCopy - 3; } } @@ -547,55 +725,71 @@ pos++; } - //newStr = newStr + aStr.substr(pos+2, chunkLength); - if (this.debug) this.logInfo("unchunk: pos:"+pos+", CunkStr:"+newStr+"|"); - //pos = pos + chunkLength + 2; + if (this.debug) { + this.logInfo("unchunk: pos:" + pos + ", CunkStr:" + gatheredString + "|"); + } + // Next two bytes should be \r\n - var check = aStr.substr(pos, 2); + var check = aChunkedString.substr(pos, 2); if (check != "\r\n") { - if (this.debug) this.logInfo("unchunk: Strange. Expected 0D0A (Cr+Lf) but found:"+check+". Stopping processing of this chunked message."); + if (this.debug) { + this.logInfo("unchunk: Strange. Expected 0D0A (Cr+Lf) but found:" + + check + ". Stopping processing of this chunked message."); + } return ""; } pos = pos + 2; - var tmpStr = aStr.substr(pos, 6); + var tmpStr = aChunkedString.substr(pos, 6); var pos2 = tmpStr.indexOf("\r\n"); chunkCounter++; if (pos2 > -1) { - if (this.debug) this.logInfo("unchunk: Found next chunk. Number:"+chunkCounter+", LengthStr:"+tmpStr.substr(0,pos2)); + if (this.debug) { + this.logInfo("unchunk: Found next chunk. Number:"+chunkCounter+", LengthStr:"+tmpStr.substr(0,pos2)); + } + chunkLength = parseInt(tmpStr.substr(0,pos2), 16); if (isNaN(chunkLength)) { - if (this.debug) this.logInfo("unchunk: Chunk '"+chunkCounter+"' is not a number:"+tmpStr); + if (this.debug) { + this.logInfo("unchunk: Chunk '"+chunkCounter+"' is not a number:"+tmpStr); + } return ""; } - if (this.debug) this.logInfo("unchunk: Chunk '"+chunkCounter+"' has length:"+chunkLength); + if (this.debug) { + this.logInfo("unchunk: Chunk '"+chunkCounter+"' has length:"+chunkLength); + } pos = pos + pos2; } else { - if (this.debug) this.logInfo("unchunk: Trying to determine chunk '"+chunkCounter+"' length but it is more than 4 bytes big!! size:"+tmpStr); + if (this.debug) { + this.logInfo("unchunk: Trying to determine chunk '"+chunkCounter+"' length but it is more than 4 bytes big!! size:"+tmpStr); + } return ""; } } - return newStr; + return gatheredString; } else { - if (this.debug) this.logInfo("unchunk: Trying to determine first chunk length but it is very big...!! size:"+pos); - return aStr; + if (this.debug) { + this.logInfo("unchunk: Trying to determine first chunk length but it is very big...!! size:" + pos); + } + return aChunkedString; } }, saveToFile: function _saveToFile(aFilename, aContent) { var file = Cc["@mozilla.org/file/directory_service;1"] - .getService(Components.interfaces.nsIProperties) - .get("ProfD", Components.interfaces.nsIFile); + .getService(Components.interfaces.nsIProperties) + .get("ProfD", Components.interfaces.nsIFile); + file.append("exchange-data"); if ( !file.exists() || !file.isDirectory() ) { - file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8)); + file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8)); } file.append("responses"); if ( !file.exists() || !file.isDirectory() ) { - file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8)); + file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8)); } if (!this.fileCount) { @@ -606,73 +800,65 @@ } if (this.fileCount < 10) { - file.append(this.uuid+"-00"+this.fileCount+"."+aFilename); + file.append(this.uuid+"-00" + this.fileCount + "."+aFilename); + } + else if (this.fileCount < 100) { + file.append(this.uuid+"-0" + this.fileCount + "." + aFilename); } else { - if (this.fileCount < 100) { - file.append(this.uuid+"-0"+this.fileCount+"."+aFilename); - } - else { - file.append(this.uuid+"-"+this.fileCount+"."+aFilename); - } + file.append(this.uuid+"-" + this.fileCount + "."+aFilename); } if (file.exists()) { file.remove(false); } -// file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0777); - - var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]. - createInstance(Components.interfaces.nsIFileOutputStream); - foStream.init(file, 0x02 | 0x08 | 0x20, parseInt("0777", 8), 0); + var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]. + createInstance(Components.interfaces.nsIFileOutputStream); + foStream.init(file, 0x02 | 0x08 | 0x20, parseInt("0777", 8), 0); var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"]. - createInstance(Components.interfaces.nsIConverterOutputStream); + createInstance(Components.interfaces.nsIConverterOutputStream); converter.init(foStream, "UTF-8", 0, 0); converter.writeString(aContent); converter.close(); // this closes foStream - + return 0; }, - onLoad:function _onLoad(evt) + onLoad:function _onLoad(evt) { let xmlReq = this.mXmlReq; - if (this.debug) this.logInfo(": ExchangeRequest.onLoad :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status); - - if (this.debug) this.logInfo(": ExchangeRequest.onLoad :"+xmlReq.getAllResponseHeaders(),2); - - if (this.debug) this.logInfo(": ExchangeRequest.onLoad :"+xmlReq.responseText,2); - - //this.exchangeStatistics.addDataRead(this.currentUrl, xmlReq.responseText.length); - - if (xmlReq.readyState != 4) { - - //if (this.tryNextURL()) return; - - if (this.debug) this.logInfo("readyState < 4. THIS SHOULD NEVER HAPPEN. PLEASE REPORT."); - this.fail(this.ER_ERROR_OPEN_FAILED,"Ready state != 4, readyState:"+xmlReq.readyState); - return; + if (this.debug) { + this.logInfo(": ExchangeRequest.onLoad :" + evt.type + + ", readyState:" + xmlReq.readyState + + ", status:" + xmlReq.status); + this.logInfo(": ExchangeRequest.onLoad :" + + xmlReq.getAllResponseHeaders(), 2); + this.logInfo(": ExchangeRequest.onLoad :" + xmlReq.responseText, 2); } - if (this.isHTTPRedirect(evt)) { + if (xmlReq.readyState != xmlReq.DONE) { + if (this.debug) { + this.logInfo("readyState is not DONE inside the onLoad internal function. THIS SHOULD NEVER HAPPEN. PLEASE REPORT."); + } + this.fail(this.ER_ERROR_OPEN_FAILED, + "Ready state != 4, readyState:" + xmlReq.readyState); return; } - if (this.isHTTPError()) { + // Check redirection and follow it if possible + // Check if this is an HTTP Error + if (this.isHTTPRedirect(evt) || this.isHTTPError()) { return; } var xml = xmlReq.responseText; // bug 270553 - //this.saveToFile("onload.xml", xml); - -// Removed following as this is no longer a problem as we are not using E4X anymore. -// xml = xml.replace(//g, ""); // BUG 61 remove hexadecimal code 0x10. It will fail in xml conversion. - var newXML; + + // Initiate XML parser try { if (this.xml2json === true) { newXML = xml2json.newJSON(); @@ -681,8 +867,13 @@ newXML = new mivIxml2jxon('', 0, null); } } - catch(exc) { if (this.debug) this.logInfo("createInstance error:"+exc);} + catch(exc) { + if (this.debug) { + this.logInfo("createInstance error:"+exc); + } + } + // Parse XML data try { if (this.xml2json === true) { xml2json.parseXML(newXML, xml); @@ -696,7 +887,12 @@ newXML.processXMLString(xml, 0, null); } } - catch(exc) { if (this.debug) this.logInfo("processXMLString error:"+exc.name+", "+exc.message+"\n"+xml);} + catch(exc) { + if (this.debug) { + this.logInfo("processXMLString error:" + exc.name + "," + + exc.message + "\n" + xml); + } + } this.mAuthFail = 0; this.mRunning = false; @@ -706,38 +902,52 @@ try { if (this.xml2json === true) { let serverVersion = xml2json.XPath(newXML,"/Envelope/Header/ServerVersionInfo"); - if ((serverVersion.length > 0) && (xml2json.getAttribute(serverVersion[0], "Version") !== null)) { - this.exchangeStatistics.setServerVersion(this.currentUrl, xml2json.getAttribute(serverVersion[0], "Version"), xml2json.getAttribute(serverVersion[0], "MajorVersion"), xml2json.getAttribute(serverVersion[0], "MinorVersion")); + if (serverVersion.length > 0 + && xml2json.getAttribute(serverVersion[0], "Version") !== null) { + this.exchangeStatistics.setServerVersion(this.currentUrl, + xml2json.getAttribute(serverVersion[0], "Version"), + xml2json.getAttribute(serverVersion[0], "MajorVersion"), + xml2json.getAttribute(serverVersion[0], "MinorVersion")); } serverVersion = null; } else { let serverVersion = newXML.XPath("/s:Header/ServerVersionInfo"); - if ((serverVersion.length > 0) && (serverVersion[0].getAttribute("Version") != "")) { - this.exchangeStatistics.setServerVersion(this.currentUrl, serverVersion[0].getAttribute("Version"), serverVersion[0].getAttribute("MajorVersion"), serverVersion[0].getAttribute("MinorVersion")); + if (serverVersion.length > 0 + && serverVersion[0].getAttribute("Version") != "") { + this.exchangeStatistics.setServerVersion(this.currentUrl, + serverVersion[0].getAttribute("Version"), + serverVersion[0].getAttribute("MajorVersion"), + serverVersion[0].getAttribute("MinorVersion")); } serverVersion[0] = null; serverVersion = null; } } - catch(err) { } + catch(err) { + } this.retryCount = 0; - if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) { exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; } -try { - this.mCbOk(this, newXML); -}catch(err) { dump("onload: err:"+err+"\n"+this.globalFunctions.STACK()+"\n"+xml+"\n");} + try { + this.mCbOk(this, newXML); + } + catch(err) + { + if (this.debug) { + this.logInfo("onLoad: err:" + err); + this.logInfo("onLoad: stack:" + this.globalFunctions.STACK()); + this.logInfo("onLoad: xml:" + xml); + } + } this.originalReq = null; } -//dump(" stat: time1:"+(time2-time1)+", time2:"+(time4-time3)+"\n"); newXML = null; - - this.observerService.notifyObservers(this._notificationCallbacks, "onExchangeConnectionOk", this.currentUrl); + this.observerService.notifyObservers(this.channelCallbackEcAuthPrompt2, "onExchangeConnectionOk", this.currentUrl); }, retryCurrentUrl: function() @@ -747,14 +957,18 @@ tryNextURL: function _tryNextURL() { - if (this.debug) this.logInfo("exchangeRequest.tryNextURL"); - let xmlReq = this.mXmlReq; - if (xmlReq.readyState != 4) { + if (this.debug) { + this.logInfo("exchangeRequest.tryNextURL"); + } + + let xmlReq = this.mXmlReq; + + if (xmlReq.readyState != xmlReq.DONE) { xmlReq.abort(); } if (this.urllist.length > 0) { - if (this.debug) this.logInfo("exchangeRequest.tryNextURL: We have another URLto try the request on."); + if (this.debug) this.logInfo("exchangeRequest.tryNextURL: We have another URL to try the request on."); this.sendRequest(this.mData); return true; } @@ -769,161 +983,179 @@ // https://webmail.example.com/ews/exchange.asmx var tmpColon = tmpURL.indexOf("://"); - tmpURL = tmpURL.substr(0, tmpColon+3) + aUser + "@" + tmpURL.substr(tmpColon+3); + tmpURL = tmpURL.substr(0, tmpColon + 3) + aUser + "@" + tmpURL.substr(tmpColon+3); } - return this._notificationCallbacks.getPrePassword(aUser, tmpURL); + return this.channelCallbackEcAuthPrompt2.getPrePassword(aUser, tmpURL); }, - isHTTPError: function() - { - let xmlReq = this.mXmlReq; + isHTTPError: function() + { + let xmlReq = this.mXmlReq; - if (xmlReq.status != 200) { + if (xmlReq.status != 200) { if (xmlReq.status == 303) { // See Other (since HTTP/1.1) new request should be a GET instead of a POST. - this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Redirection "+xmlReq.status+": See Other\n"+xmlReq.responseText.substr(0,300)+"\n\n"); - return true; + this.fail(this.ER_ERROR_HTTP_ERROR4XX, + "HTTP Redirection " + xmlReq.status + ": See Other\n" + + xmlReq.responseText.substr(0,300) + "\n\n"); + return true; } - if ((xmlReq.status > 399) && (xmlReq.status < 500)) { - + if ((xmlReq.status > 399) && (xmlReq.status < 500)) { var errMsg = ""; switch (xmlReq.status) { - case 400: errMsg = "Bad request"; break; - case 401: errMsg = "Unauthorized"; break; - case 402: errMsg = "Payment required"; break; - case 403: errMsg = "Forbidden"; break; - case 404: errMsg = "Not found"; break; - case 405: errMsg = "Method not allowed"; break; - case 406: errMsg = "Not acceptable"; break; - case 407: errMsg = "Proxy athentication required"; break; - case 408: errMsg = "Request timeout"; break; - case 409: errMsg = "Conflict"; break; - case 410: errMsg = "Gone"; break; - case 411: errMsg = "Length required"; break; - case 412: errMsg = "Precondition failed"; break; - case 413: errMsg = "Request entity too large"; break; - case 414: errMsg = "Request-URI too long"; break; - case 415: errMsg = "Unsupported media type"; break; - case 416: errMsg = "Request range not satisfiable"; break; - case 417: errMsg = "Expectation failed"; break; - case 418: errMsg = "I'm a teapot(RFC 2324)"; break; - case 420: errMsg = "Enhance your calm (Twitter)"; break; - case 422: errMsg = "Unprocessable entity (WebDAV)(RFC 4918)"; break; - case 423: errMsg = "Locked (WebDAV)(RFC 4918)"; break; - case 424: errMsg = "Failed dependency (WebDAV)(RFC 4918)"; break; - case 425: errMsg = "Unordered collection (RFC 3648)"; break; - case 426: errMsg = "Upgrade required (RFC2817)"; break; - case 428: errMsg = "Precondition required"; break; - case 429: errMsg = "Too many requests"; break; - case 431: errMsg = "Request header fields too large"; break; - case 444: errMsg = "No response"; break; - case 449: errMsg = "Retry with"; break; - case 450: errMsg = "Blocked by Windows Parental Controls"; break; - case 499: errMsg = "Client closed request"; break; + case 400: errMsg = "Bad request"; break; + case 401: errMsg = "Unauthorized"; break; + case 402: errMsg = "Payment required"; break; + case 403: errMsg = "Forbidden"; break; + case 404: errMsg = "Not found"; break; + case 405: errMsg = "Method not allowed"; break; + case 406: errMsg = "Not acceptable"; break; + case 407: errMsg = "Proxy athentication required"; break; + case 408: errMsg = "Request timeout"; break; + case 409: errMsg = "Conflict"; break; + case 410: errMsg = "Gone"; break; + case 411: errMsg = "Length required"; break; + case 412: errMsg = "Precondition failed"; break; + case 413: errMsg = "Request entity too large"; break; + case 414: errMsg = "Request-URI too long"; break; + case 415: errMsg = "Unsupported media type"; break; + case 416: errMsg = "Request range not satisfiable"; break; + case 417: errMsg = "Expectation failed"; break; + case 418: errMsg = "I'm a teapot(RFC 2324)"; break; + case 420: errMsg = "Enhance your calm (Twitter)"; break; + case 422: errMsg = "Unprocessable entity (WebDAV)(RFC 4918)"; break; + case 423: errMsg = "Locked (WebDAV)(RFC 4918)"; break; + case 424: errMsg = "Failed dependency (WebDAV)(RFC 4918)"; break; + case 425: errMsg = "Unordered collection (RFC 3648)"; break; + case 426: errMsg = "Upgrade required (RFC2817)"; break; + case 428: errMsg = "Precondition required"; break; + case 429: errMsg = "Too many requests"; break; + case 431: errMsg = "Request header fields too large"; break; + case 444: errMsg = "No response"; break; + case 449: errMsg = "Retry with"; break; + case 450: errMsg = "Blocked by Windows Parental Controls"; break; + case 499: errMsg = "Client closed request"; break; } - if (this.debug) this.logInfo(": isConnError req.status="+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText, 2); + if (this.debug) { + this.logInfo(": isConnError req.status=" + xmlReq.status + + ": " +errMsg + "\nURL:" + this.currentUrl + "\n" + + xmlReq.responseText, 2); + } var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(Ci.mivExchangeAuthPrompt2); - if ((this.urllist.length > 0) && (!myAuthPrompt2.getUserCanceled(this.currentUrl))) { - if (this.tryNextURL()) { + if (this.urllist.length > 0 && !myAuthPrompt2.getUserCanceled(this.currentUrl)) { + if (this.tryNextURL()) { return true; } - this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Client error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n"); + this.fail(this.ER_ERROR_HTTP_ERROR4XX, + "HTTP Client error " + xmlReq.status + ": " + + errMsg + "\nURL:" + this.currentUrl + "\n" + + xmlReq.responseText.substr(0,300)+"\n\n"); + } + else if (myAuthPrompt2.getUserCanceled(this.currentUrl)) { + this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, + "User canceled providing a valid password for url=" + + this.currentUrl + ". Aborting this request."); } else { - if (myAuthPrompt2.getUserCanceled(this.currentUrl)) { - this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled providing a valid password for url="+this.currentUrl+". Aborting this request."); - } - else { - this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Client error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n"); - } + this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Client error " + + xmlReq.status + ": " +errMsg +"\nURL:" + this.currentUrl + + "\n" + xmlReq.responseText.substr(0,300)+"\n\n"); } - return true; - - } - - if ((xmlReq.status > 499) && (xmlReq.status < 600)) { + return true; + } + if ((xmlReq.status > 499) && (xmlReq.status < 600)) { var errMsg = ""; switch (xmlReq.status) { - case 500: errMsg = "Internal server error"; - + case 500: errMsg = "Internal server error"; // First check if we have a version mismatch and we need a lower version. This sometimes happens. if (xmlReq.responseText.indexOf("ErrorInvalidServerVersion") > -1) { - if (this.debug) this.logInfo(" ErrorInvalidServerVersion -> RequestServerVersion wrong:"+this.version+".", 2); - // We are going to retry with a different serverversion. + if (this.debug) { + this.logInfo(" ErrorInvalidServerVersion -> RequestServerVersion wrong:"+this.version+".", 2); + } + + // We are going to retry with a different server version. var tryAgain = false; switch(this.version) { - case "Exchange2010": - this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2007_SP1", null, null); - tryAgain = true; - break; - case "Exchange2010_SP1": - this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null); - tryAgain = true; - break; - case "Exchange2010_SP2": - this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null); - tryAgain = true; - break; - case "Exchange2013": - this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null); - tryAgain = true; - break; - default: - tryAgain = false; + case "Exchange2010": + this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2007_SP1", null, null); + tryAgain = true; + break; + case "Exchange2010_SP1": + this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null); + tryAgain = true; + break; + case "Exchange2010_SP2": + this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null); + tryAgain = true; + break; + case "Exchange2013": + this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null); + tryAgain = true; + break; + default: + tryAgain = false; } if (tryAgain) { - if (this.debug) this.logInfo("Going to retry with lower server version", 2); + if (this.debug) { + this.logInfo("Going to retry with lower server version", 2); + } this.sendRequest(this.makeSoapMessage(this.originalReq), this.currentUrl); return true; } } - - // First check if we have a version mismatch and we need a higher version. This sometimes happens. - if ((xmlReq.responseText.indexOf("ErrorIncorrectSchemaVersion") > -1) && - (xmlReq.responseText.indexOf("RequestServerVersion") > -1) ) { - if (this.debug) this.logInfo(" ErrorIncorrectSchemaVersion -> RequestServerVersion wrong:"+this.version+".", 2); + // Next check if we have a version mismatch and we need a higher version. This sometimes happens. + if (xmlReq.responseText.indexOf("ErrorIncorrectSchemaVersion") > -1 + && xmlReq.responseText.indexOf("RequestServerVersion") > -1) { + if (this.debug){ + this.logInfo(" ErrorIncorrectSchemaVersion -> RequestServerVersion wrong:"+this.version+".", 2); + } // We are going to retry with a different serverversion. var tryAgain = false; switch(this.version) { - case "Exchange2007_SP1": - this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null); - tryAgain = true; - break; - case "Exchange2010": - this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null); - tryAgain = true; - break; - case "Exchange2010_SP1": - this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null); - tryAgain = true; - break; - case "Exchange2010_SP2": - this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2013", null, null); - tryAgain = true; - break; - default: - tryAgain = false; + case "Exchange2007_SP1": + this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null); + tryAgain = true; + break; + case "Exchange2010": + this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null); + tryAgain = true; + break; + case "Exchange2010_SP1": + this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null); + tryAgain = true; + break; + case "Exchange2010_SP2": + this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2013", null, null); + tryAgain = true; + break; + default: + tryAgain = false; } if (tryAgain) { - if (this.debug) this.logInfo("Going to retry with higher server version", 2); + if (this.debug) { + this.logInfo("Going to retry with higher server version", 2); + } this.sendRequest(this.makeSoapMessage(this.originalReq), this.currentUrl); return true; } } // This might be generated because of a password not yet supplied in open function during a request so we try again - //if ((this.prePassword == "") && - if ((!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) || (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount < 3)) { - if (this.debug) this.logInfo("isHTTPError: We are going to ask the user or password store for a password and try again."); + if ((!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) + || (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount < 3)) { + if (this.debug) { + this.logInfo("isHTTPError: We are going to ask the user or password store for a password and try again."); + } this.prePassword = this.getPrePassword(this.currentUrl, this.mArgument.user); if (this.prePassword) { - - if (this.debug) this.logInfo("isHTTPError: We received a prePassword. Going to retry current URL"); + if (this.debug) { + this.logInfo("isHTTPError: We received a prePassword. Going to retry current URL"); + } if (!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) { exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl] = {}; @@ -933,17 +1165,24 @@ exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount++; xmlReq.abort(); - this.retryCurrentUrl(); return true; } - if (this.debug) this.logInfo("isHTTPError: User canceled request for prePassword."); + if (this.debug) { + this.logInfo("isHTTPError: User canceled request for prePassword."); + } } - if ((exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) && (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount > 2)) { + // Password were given and that's the third try we have an error + if ((exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) + && (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount > 2)) { // Failed three times. Remove password also from password store. - if (this.debug) this.logInfo("isHTTPError: Failed password "+exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount+" times. Stopping communication."); + if (this.debug) { + this.logInfo("isHTTPError: Failed password " + + exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount + + " times. Stopping communication."); + } var title = "Microsoft Exchange EWS"; var tmpURL = this.currentUrl; if (this.mArgument.user != "") { @@ -953,63 +1192,79 @@ var tmpColon = tmpURL.indexOf("://"); tmpURL = tmpURL.substr(0, tmpColon+3) + this.mArgument.user + "@" + tmpURL.substr(tmpColon+3); } - this._notificationCallbacks.passwordManagerRemove(this.mArgument.user, tmpURL, title); + this.channelCallbackEcAuthPrompt2.passwordManagerRemove(this.mArgument.user, tmpURL, title); } + // Finally reset password cache if (!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) { exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl] = {}; } - + exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0; this.prePassword = null; - break; - case 501: errMsg = "Not implemented"; break; - case 502: errMsg = "Bad gateway"; break; - case 503: errMsg = "Service unavailable"; break; - case 504: errMsg = "Gateway timeout"; break; - case 505: errMsg = "HTTP version not supported"; break; - case 506: errMsg = "Variant also negotiates (RFC 2295)"; break; - case 507: errMsg = "Insufficient Storage (WebDAV)(RFC 4918)"; break; - case 508: errMsg = "Loop detected (WebDAV)(RFC 4918)"; break; - case 509: errMsg = "Bandwith limit exceeded (Apache bw/limited extension)"; break; - case 510: errMsg = "Not extended (RFC 2774)"; break; - case 511: errMsg = "Network authentication required"; break; - case 598: errMsg = "Network read timeout error"; break; - case 599: errMsg = "Network connect timeout error"; break; + case 501: errMsg = "Not implemented"; break; + case 502: errMsg = "Bad gateway"; break; + case 503: errMsg = "Service unavailable"; break; + case 504: errMsg = "Gateway timeout"; break; + case 505: errMsg = "HTTP version not supported"; break; + case 506: errMsg = "Variant also negotiates (RFC 2295)"; break; + case 507: errMsg = "Insufficient Storage (WebDAV)(RFC 4918)"; break; + case 508: errMsg = "Loop detected (WebDAV)(RFC 4918)"; break; + case 509: errMsg = "Bandwith limit exceeded (Apache bw/limited extension)"; break; + case 510: errMsg = "Not extended (RFC 2774)"; break; + case 511: errMsg = "Network authentication required"; break; + case 598: errMsg = "Network read timeout error"; break; + case 599: errMsg = "Network connect timeout error"; break; } - if (this.debug) this.logInfo(": isConnError req.status="+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText, 2); + if (this.debug) { + this.logInfo(": isConnError req.status=" + + xmlReq.status + ": " + errMsg + + "\nURL:" + this.currentUrl + "\n" + + xmlReq.responseText, 2); + } if (this.tryNextURL()) { return true; } - this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Server error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n"); - return true; - } + this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Server error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n"); + return true; + } // End of error status 5xx if (this.tryNextURL()) { return true; } - // XXX parse it - this.fail(this.ER_ERROR_FROM_SERVER, "Unknown error from server"+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n"); - return true; - } - return false; - }, + // XXX parse it + this.fail(this.ER_ERROR_FROM_SERVER, "Unknown error from server" + + xmlReq.status + ": " + errMsg + "\nURL:"+this.currentUrl + + "\n" + xmlReq.responseText.substr(0,300) + "\n\n"); + return true; + } // Received HTTP 200 OK + + // That wasn't an HTTP error + return false; + }, fail: function(aCode, aMsg) { - if (this.debug) this.logInfo("ecExchangeRequest.fail: aCode:"+aCode+", aMsg:"+aMsg); + if (this.debug) { + this.logInfo("ecExchangeRequest.fail: aCode:"+aCode+", aMsg:"+aMsg); + } + if (this.mCbError) { this.mCbError(this, aCode, aMsg); } + this.originalReq = null; }, + /* + * Generate SOAP message by xml2json + */ makeSoapMessage2: function erMakeSoapMessage2(aReq) { this.originalReq = aReq; @@ -1021,23 +1276,23 @@ xml2json.setAttribute(msg, "xmlns:nsTypes", nsTypesStr); this.version = this.exchangeStatistics.getServerVersion(this.mArgument.serverUrl); - + var header = xml2json.addTag(msg,"Header", "nsSoap", null); var requestServerVersion = xml2json.addTag(header, "RequestServerVersion", "nsTypes", null); xml2json.setAttribute(requestServerVersion, "Version", this.version); - + var exchTimeZone = this.timeZones.getExchangeTimeZoneByCalTimeZone(this.globalFunctions.ecDefaultTimeZone(), this.mArgument.serverUrl, cal.now()); if (exchTimeZone) { - let timeZoneContext = xml2json.addTag(header, "TimeZoneContext", "nsTypes", null); - let tmpTimeZone = xml2json.addTag(timeZoneContext, "TimeZoneDefinition", "nsTypes"); - if (this.version.indexOf("2007") < 0) { - xml2json.setAttribute(tmpTimeZone, "Name",exchTimeZone.name); - } - xml2json.setAttribute(tmpTimeZone, "Id",exchTimeZone.id); - tmpTimeZone = null; - timeZoneContext = null; + let timeZoneContext = xml2json.addTag(header, "TimeZoneContext", "nsTypes", null); + let tmpTimeZone = xml2json.addTag(timeZoneContext, "TimeZoneDefinition", "nsTypes"); + if (this.version.indexOf("2007") < 0) { + xml2json.setAttribute(tmpTimeZone, "Name",exchTimeZone.name); + } + xml2json.setAttribute(tmpTimeZone, "Id",exchTimeZone.id); + tmpTimeZone = null; + timeZoneContext = null; } header = null; @@ -1051,6 +1306,9 @@ return tmpStr; }, + /* + * Generate SOAP message by mivIxml2jxon + */ makeSoapMessage: function erMakeSoapMessage(aReq) { this.originalReq = aReq; @@ -1058,41 +1316,29 @@ var msg = new mivIxml2jxon('<nsSoap:Envelope xmlns:nsSoap="'+nsSoapStr+'" xmlns:nsMessages="'+nsMessagesStr+'" xmlns:nsTypes="'+nsTypesStr+'"/>', 0, null); this.version = this.exchangeStatistics.getServerVersion(this.mArgument.serverUrl); - + var header = msg.addChildTag("Header", "nsSoap", null); + header.addChildTag("RequestServerVersion", "nsTypes", null).setAttribute("Version", this.version); -/* if (this.mArgument.ServerVersion) { - header.addChildTag("RequestServerVersion", "nsTypes", null).setAttribute("Version", this.mArgument.ServerVersion); - } - else {*/ - header.addChildTag("RequestServerVersion", "nsTypes", null).setAttribute("Version", this.version); -// } - var exchTimeZone = this.timeZones.getExchangeTimeZoneByCalTimeZone(this.globalFunctions.ecDefaultTimeZone(), this.mArgument.serverUrl, cal.now()); if (exchTimeZone) { - //exchTimeZone.timeZone.tagName = "TimeZoneDefinition"; - //header.addChildTag("TimeZoneContext", "nsTypes", null).addChildTagObject(exchTimeZone.timeZone); - - if (this.version.indexOf("2007") > -1) { - var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null); - tmpTimeZone.setAttribute("Id",exchTimeZone.id); - } - else { - var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null); - tmpTimeZone.setAttribute("Name",exchTimeZone.name); - tmpTimeZone.setAttribute("Id",exchTimeZone.id); - } - header.addChildTag("TimeZoneContext", "nsTypes", null).addChildTagObject(tmpTimeZone); - tmpTimeZone = null; + if (this.version.indexOf("2007") > -1) { + var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null); + tmpTimeZone.setAttribute("Id",exchTimeZone.id); + } + else { + var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null); + tmpTimeZone.setAttribute("Name",exchTimeZone.name); + tmpTimeZone.setAttribute("Id",exchTimeZone.id); + } + header.addChildTag("TimeZoneContext", "nsTypes", null).addChildTagObject(tmpTimeZone); + tmpTimeZone = null; } header = null; msg.addChildTag("Body", "nsSoap", null).addChildTagObject(aReq); -//dump("Going to send1:"+msg.toString().length+", xml:"+msg.getSize()+"\n"); -//dump("Going to send2:"+msg.toString()+"\n"); - var tmpStr = xml_tag + msg.toString(); msg = null; return tmpStr; @@ -1129,9 +1375,7 @@ { this.fail(this.ERR_PASSWORD_ERROR, aMsg); }, - - -}; +}; // End of ExchangeRequest prototype var ecPasswordErrorList = {}; @@ -1140,7 +1384,7 @@ this.exchangeRequest = aExchangeRequest; this.globalFunctions = Cc["@1st-setup.nl/global/functions;1"] - .getService(Ci.mivFunctions); + .getService(Ci.mivFunctions); this.uuid = this.globalFunctions.getUUID(); this.callback = null; @@ -1154,13 +1398,12 @@ this.password = null; this.URL = null; this.lastStatus = 0; // set by nsIProgressEventSink onStatus. - + this.timer = Cc["@mozilla.org/timer;1"] - .createInstance(Ci.nsITimer); + .createInstance(Ci.nsITimer); } ecnsIAuthPrompt2.prototype = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsIAuthPrompt2, Ci.nsIBadCertListener2, Ci.nsIProgressEventSink, Ci.nsISecureBrowserUI, Ci.nsIDocShellTreeItem, Ci.nsIAuthPromptProvider, Ci.nsIChannelEventSink, Ci.nsIRedirectResultListener]), @@ -1174,23 +1417,23 @@ if ((Ci.nsIBadCertListener2) && (iid.equals(Ci.nsIBadCertListener2))) { this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIBadCertListener2"); - return Cc["@1st-setup.nl/exchange/badcertlistener2;1"].getService(Ci.mivExchangeBadCertListener2); + return Cc["@1st-setup.nl/exchange/badcertlistener2;1"].getService(Ci.mivExchangeBadCertListener2); } if ((Ci.nsIProgressEventSink) && (iid.equals(Ci.nsIProgressEventSink))) { // iid == d974c99e-4148-4df9-8d98-de834a2f6462 this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIProgressEventSink"); - return this; - } + return this; + } if ((Ci.nsISecureBrowserUI) && (iid.equals(Ci.nsISecureBrowserUI))) { // iid == 081e31e0-a144-11d3-8c7c-00609792278c this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsISecureBrowserUI"); - return this; + return this; } if ((Ci.nsIDocShellTreeItem) && (iid.equals(Ci.nsIDocShellTreeItem))) { // iid == 09b54ec1-d98a-49a9-bc95-3219e8b55089 this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIDocShellTreeItem"); - return Cr.NS_NOINTERFACE; - } + return Cr.NS_NOINTERFACE; + } if ((Ci.nsIAuthPromptProvider) && (iid.equals(Ci.nsIAuthPromptProvider))) { // iid == bd9dc0fa-68ce-47d0-8859-6418c2ae8576 this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIAuthPromptProvider"); @@ -1199,12 +1442,12 @@ if ((Ci.nsIChannelEventSink) && (iid.equals(Ci.nsIChannelEventSink))) { // iid == a430d870-df77-4502-9570-d46a8de33154 this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIChannelEventSink"); - return this; + return this; } if ((Ci.nsIRedirectResultListener) && (iid.equals(Ci.nsIRedirectResultListener))) { // iid == 85cd2640-e91e-41ac-bdca-1dbf10dc131e this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIRedirectResultListener"); - return this; + return this; } // The next iid is available sine TB 13. @@ -1219,7 +1462,6 @@ return Cr.NS_NOINTERFACE; // We do not support this. } - this.globalFunctions.LOG(" >>>>>>>>>>> SUBMIT THIS LINE TO https://github.com/Ericsson/exchangecalendar/issues: ecnsIAuthPrompt2.getInterface("+iid+")"); throw Cr.NS_NOINTERFACE; }, @@ -1238,15 +1480,15 @@ this.lastStatus = aStatus; this.lastStatusArg = aStatusArg; switch (aStatus) { - case 0x804b0003: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVING of "+aStatusArg); break; - case 0x804b000b: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVED of "+aStatusArg); break; - case 0x804b0007: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTING_TO of "+aStatusArg); break; - case 0x804b0004: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTED_TO of "+aStatusArg); break; - case 0x804b0005: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_SENDING_TO of "+aStatusArg); break; - case 0x804b000a: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_WAITING_FOR of "+aStatusArg); break; - case 0x804b0006: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RECEIVING_FROM of "+aStatusArg); break; - default: - this.logInfo(" --- ecnsIAuthPrompt2.onStatus:"+aStatus+" of "+aStatusArg); + case 0x804b0003: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVING of "+aStatusArg); break; + case 0x804b000b: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVED of "+aStatusArg); break; + case 0x804b0007: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTING_TO of "+aStatusArg); break; + case 0x804b0004: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTED_TO of "+aStatusArg); break; + case 0x804b0005: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_SENDING_TO of "+aStatusArg); break; + case 0x804b000a: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_WAITING_FOR of "+aStatusArg); break; + case 0x804b0006: this.logInfo(" --- ecnsIAuthPrompt2.onStatus: STATUS_RECEIVING_FROM of "+aStatusArg); break; + default: + this.logInfo(" --- ecnsIAuthPrompt2.onStatus:"+aStatus+" of "+aStatusArg); } }, @@ -1272,22 +1514,27 @@ this.logInfo(" --- ecnsIAuthPrompt2.tooltipText (nsISecureBrowserUI):"); return "ecnsIAuthPrompt2.tooltipText"; }, - + // nsIChannelEventSink //void asyncOnChannelRedirect(in nsIChannel oldChannel, - // in nsIChannel newChannel, - // in unsigned long flags, - // in nsIAsyncVerifyRedirectCallback callback); + // in nsIChannel newChannel, + // in unsigned long flags, + // in nsIAsyncVerifyRedirectCallback callback); asyncOnChannelRedirect: function _nsIChannelEventSink_asyncOnChannelRedirect(oldChannel, newChannel, flags, callback) { var tmpStr = ""; - if (flags & 1) tmpStr += "REDIRECT_TEMPORARY"; - if (flags & 2) tmpStr += " REDIRECT_PERMANENT"; - if (flags & 4) tmpStr += " REDIRECT_INTERNAL"; + if (flags & 1) { + tmpStr += "REDIRECT_TEMPORARY"; + } + if (flags & 2) { + tmpStr += " REDIRECT_PERMANENT"; + } + if (flags & 4) { + tmpStr += " REDIRECT_INTERNAL"; + } this.logInfo(" --- nsIChannelEventSink.asyncOnChannelRedirect :flags:"+flags+"="+tmpStr); - var url1 = ""; var url2 = ""; @@ -1296,8 +1543,8 @@ this.logInfo("We are going to allow the redirect from '"+url1+"' to '"+url2+"'."); - newChannel.notificationCallbacks = this; - callback.onRedirectVerifyCallback(Cr.NS_OK); + newChannel.notificationCallbacks = this; + callback.onRedirectVerifyCallback(Cr.NS_OK); }, // nsIRedirectResultListener @@ -1312,7 +1559,7 @@ this.logInfo("getPrePassword for user:"+aUsername+", server url:"+aURL); this.username = aUsername; this.URL = aURL; - + var password; var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(Ci.mivExchangeAuthPrompt2); if (myAuthPrompt2.getUserCanceled(aURL)) { @@ -1339,6 +1586,4 @@ this.globalFunctions.LOG(this.uuid+": "+aMsg); } }, - - -} +} // End of ecnsIAuthPrompt2 prototype diff -Nru calendar-exchange-provider-3.9.0/debian/changelog calendar-exchange-provider-4.0.0~beta4/debian/changelog --- calendar-exchange-provider-3.9.0/debian/changelog 2017-04-08 14:45:28.000000000 +0200 +++ calendar-exchange-provider-4.0.0~beta4/debian/changelog 2017-08-25 19:14:23.000000000 +0200 @@ -1,3 +1,30 @@ +calendar-exchange-provider (4.0.0~beta4-1) unstable; urgency=medium + + * New upstream release + * Bump Standard-Version to 4.0.0, no changes needed + * Change patching into rules + * Correct typos in changelog + + -- Mechtilde Stehmann <mechtilde@debian.org> Fri, 25 Aug 2017 19:14:23 +0200 + +calendar-exchange-provider (4.0.0~beta2-1) unstable; urgency=medium + + * New upstream release + + Changing history_en_US.txt to CHANGELOG.md + * Changing dependency and build dependency in control (>= 52) + * Adapt description to thunderbird transition + * Analog to thunderbird bump to sid + + -- Mechtilde Stehmann <mechtilde@debian.org> Sun, 18 Jun 2017 20:20:56 +0200 + +calendar-exchange-provider (4.0.0~beta1-1) experimental; urgency=low + + * New upstream release for using with thunderbird 52.x + + (Closes: #864484) + * Changed upstream URL in control and watch + + -- Mechtilde Stehmann <mechtilde@debian.org> Fri, 09 Jun 2017 18:04:59 +0200 + calendar-exchange-provider (3.9.0-4) unstable; urgency=low * debian/patches/bugfix-854025.patch: diff -Nru calendar-exchange-provider-3.9.0/debian/control calendar-exchange-provider-4.0.0~beta4/debian/control --- calendar-exchange-provider-3.9.0/debian/control 2017-04-08 14:41:26.000000000 +0200 +++ calendar-exchange-provider-4.0.0~beta4/debian/control 2017-08-25 19:13:23.000000000 +0200 @@ -2,27 +2,27 @@ Section: mail Priority: optional Maintainer: Mechtilde Stehmann <mechtilde@debian.org> -Build-Depends: debhelper (>= 9), mozilla-devscripts, icedove-dev (>= 45) | thunderbird-dev, python-ply +Build-Depends: debhelper (>= 9), mozilla-devscripts, thunderbird-dev (>= 52), python-ply Standards-Version: 3.9.8 Vcs-Git: https://anonscm.debian.org/cgit/collab-maint/calendar-exchange-provider.git/ Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/calendar-exchange-provider.git/ -Homepage: https://github.com/Ericsson/exchangecalendar +Homepage: https://github.com/ExchangeCalendar/exchangecalendar Package: calendar-exchange-provider Architecture: all -Depends: ${misc:Depends}, ${xpi:Depends}, iceowl-extension | lightning +Depends: ${misc:Depends}, ${xpi:Depends}, thunderbird (>= 52), lightning Recommends: ${xpi:Recommends} Provides: ${xpi:Provides} Enhances: ${xpi:Enhances} Breaks: ${xpi:Breaks} -Description: MS Exchange support for iceowl-extension +Description: MS Exchange support for Thunderbird/Lightning This plugin allows one to communicate with an Exchange 2007 or 2010 server using the Exchange Web Service (EWS) interface. . Plugin works with the Exchange Webservice Server of Exchange 2007 or 2010 or that from Microsoft Office 365. . - With this plugin, you can perform these tasks from within Icedove/Thunderbird: + With this plugin, you can perform these tasks from within Thunderbird: . * Sync Calendar and Task/Todo items from an EWS (Exchange) server. Syncing is done on a user settable poll interval. It will track changes on the server diff -Nru calendar-exchange-provider-3.9.0/debian/patches/bugfix-854025.patch calendar-exchange-provider-4.0.0~beta4/debian/patches/bugfix-854025.patch --- calendar-exchange-provider-3.9.0/debian/patches/bugfix-854025.patch 2017-04-08 14:43:22.000000000 +0200 +++ calendar-exchange-provider-4.0.0~beta4/debian/patches/bugfix-854025.patch 1970-01-01 01:00:00.000000000 +0100 @@ -1,21 +0,0 @@ -bugfix for Bug #854025 - ---- a/interfaces/exchangeCalendar/mivExchangeCalendar.js -+++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js -@@ -5569,10 +5569,14 @@ - var proposeStart = this.tryToSetDateValue(input.proposeStart,""); - var proposeEnd = this.tryToSetDateValue(input.proposeEnd,""); - var proposeNewTime = false; -- -+ -+ if ( proposeStart ) { - input.proposeStart = cal.toRFC3339(proposeStart.getInTimezone(this.globalFunctions.ecUTC())); -+ } -+ if ( proposeEnd ) { - input.proposeEnd = cal.toRFC3339(proposeEnd.getInTimezone( this.globalFunctions.ecUTC())); -- -+ } -+ - if( input.proposeStart && input.proposeEnd ){ - proposeNewTime = true; - } diff -Nru calendar-exchange-provider-3.9.0/debian/patches/remove-update-notification.patch calendar-exchange-provider-4.0.0~beta4/debian/patches/remove-update-notification.patch --- calendar-exchange-provider-3.9.0/debian/patches/remove-update-notification.patch 2017-04-08 14:11:48.000000000 +0200 +++ calendar-exchange-provider-4.0.0~beta4/debian/patches/remove-update-notification.patch 1970-01-01 01:00:00.000000000 +0100 @@ -1,9 +0,0 @@ -remove update notification - ---- a/defaults/preferences/update.js -+++ b/defaults/preferences/update.js -@@ -1 +1,3 @@ --user_pref("extensions.1st-setup.others.updateRequired", true); -+user_pref("extensions.1st-setup.others.updateRequired", false); -+user_pref("extensions.1st-setup.others.warnAboutNewAddOnVersion", false); -+user_pref("extensions.1st-setup.others.checkForNewAddOnVersion", false); diff -Nru calendar-exchange-provider-3.9.0/debian/patches/series calendar-exchange-provider-4.0.0~beta4/debian/patches/series --- calendar-exchange-provider-3.9.0/debian/patches/series 2017-04-08 13:13:34.000000000 +0200 +++ calendar-exchange-provider-4.0.0~beta4/debian/patches/series 1970-01-01 01:00:00.000000000 +0100 @@ -1,2 +0,0 @@ -remove-update-notification.patch -bugfix-854025.patch diff -Nru calendar-exchange-provider-3.9.0/debian/rules calendar-exchange-provider-4.0.0~beta4/debian/rules --- calendar-exchange-provider-3.9.0/debian/rules 2017-04-08 14:41:26.000000000 +0200 +++ calendar-exchange-provider-4.0.0~beta4/debian/rules 2017-08-25 19:13:23.000000000 +0200 @@ -22,15 +22,19 @@ override_dh_auto_install: install-xpi -x 'chrome/skins/fugue/Fugue Icons README.txt' \ $$(find $(TOPDIRS) -name *.idl -printf '-x %p ') \ - -x history.en_US.txt \ + -x CHANGELOG.md \ -x license.txt \ -x defaults/preferences/debug.js \ calendar-exchange-provider.xpi override_dh_installdocs: - cp history.en_US.txt Changelog + cp CHANGELOG.md Changelog dh_installdocs + mkdir -p $(CURDIR)/debian/calendar-exchange-provider/usr/share/xul-ext/calendar-exchange-provider/defaults/preferences/ + cd $(CURDIR)/debian/calendar-exchange-provider/usr/share/xul-ext/calendar-exchange-provider/defaults/preferences/ && \ + cp update_disable.txt update.js + override_dh_auto_clean: dh_auto_clean find -type f -name *.xpt -delete diff -Nru calendar-exchange-provider-3.9.0/debian/watch calendar-exchange-provider-4.0.0~beta4/debian/watch --- calendar-exchange-provider-3.9.0/debian/watch 2017-04-08 14:41:26.000000000 +0200 +++ calendar-exchange-provider-4.0.0~beta4/debian/watch 2017-08-25 19:13:23.000000000 +0200 @@ -1,3 +1,3 @@ version=3 opts="uversionmangle=s/-Beta/~beta/;s/-rc/~rc/,filenamemangle=s/.*\/v?(\d+\.\d+\.\d+(?:-(Beta|rc)\d+)?)\.tar\.gz/exchangecalendar-$1.tar.gz/" \ -https://github.com/Ericsson/exchangecalendar/releases/ .*/v?(\d+\.\d+\.\d+(?:-rc\d+)?)\.tar\.gz +https://github.com/ExchangeCalendar/exchangecalendar/releases/ .*/v?(\d+\.\d+\.\d+(?:-rc\d+)?)\.tar\.gz diff -Nru calendar-exchange-provider-3.9.0/history.en_US.txt calendar-exchange-provider-4.0.0~beta4/history.en_US.txt --- calendar-exchange-provider-3.9.0/history.en_US.txt 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/history.en_US.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1,625 +0,0 @@ -Version 3.7.0: -- d1b2860 (origin/master, origin/HEAD, master) revert calendar-event-dialog -- df713f4 Merge pull request #458 from enozkan/patch-5 -- 180e91a Update preferences.dtd for Turkish locale - -Version 3.6.0: -- a2a50be strict mode error fix -- 5db3c8d task sync and strict mode error fix -- 16d56bf translation for preference password fix -- 22850a8 preference password fix -- 1fcaf4c Merge pull request #423 from Dominique-2202/patch-2 -- 6b16cad French translation calendar-summary-dialog.dtd -- ae091d5 Merge pull request #422 from Mechtilde/Translation -- d716986 German translation for calendar-summary-dialog.dtd -- 65c222a Merge pull request #415 from enozkan/patch-4 -- 1fd65b1 Merge pull request #416 from Trim/erFindContactsOffset -- 23ca0b3 Merge pull request #417 from Trim/erFindCalendarItems -- e537089 Update calendar-summary-dialog.dtd for tr -- 7b4b9fb erFindContacts: give a copy of arrays to callback -- 2235634 erFindContacts: Use server offset instead of own computation -- b7dd3aa erFindContacts: remove trailing blanks and use contact logs instead of main logs -- 9a5b78d erFindContacts: Requests all contacts of address books -- 4681316 erFindCalendarItems: use slice method to clone javascript arrays -- 91ac17f erFindCalendarItems: don't cal too many times possibly big array -- b45a6f4 erFindCalendarItems: use LOG instead of dump -- 3f9de40 string not translatable #409 -- 9a82408 its good to have xpi filename with 'v' preceeding the version - -Version 3.5.0: -- Fix Thunderbird hangs on startup -- Fix Be more defensive about terminating the loop: under some circumstances startYearDay (and I presume startYear) can be greater than endYear[Day] on entry to the loop. -- Fix Reword log, Bug #373 "Incorrect exhortationto MAIL THIS LINE TO ..." -- Fix Bug #371 "Cannot add custom reminder (alarm) to an event ..." -- Fix Lightning 4.0.2.1 - -Version 3.4.0: -- New Support Extended to Lightning 4.0.0.1 -- New Support Extended to Thunderbird 38.* -- New EWS Tagger - Feature -- New Task Email Follow Up - Feature -- New Language Support For exchange address Book -- New Mail folder Delegation - Feature -- New Automatically set lightning time zone -- New Plug in Builder for deb package - -- Fix Reminder Problem -- Fix #190 - Can not add manually add exchange address book -- Fix Calendar not refreshing during suspend/resume -- Fix Busy/Free information wasn’t available -- Fix Ignore domain request for email user names. -- Fix freezing on start up -- Fix Restoring cache -- Fix rtews.dtd typo fixed -- Fix Cant not add Google calendar -- Fix Avoid JS exception in auto completion. -- Fix Also fill out primary email address if local ID is present -- Fix Treat public DLs the same way as private ones in auto completion -- Fix Exchange Icon Update in preference -- Fix Missing Translation English language -- Fix Israel Timezone fix for Daylight savings time -- Fix Password Looping fix -- New Updated French,German Translation -- New Preference for mail properties syncing -- New Preference for Email Follow up - -- Change Update suggestions only for stable release -- Change Minimum Refresh time is set to 60 -- Change Enabled Cache by default or No disable option for cache -- Change Removed all calendar Refresh time -- Change Optimized syncing method -- Change Enable NTLM by default in Thunderbird -- Change Remove old saved password if user doesn’t choose -- Change Block adding domain entry in autodiscovery window when email used -- Change Platform based CSS thanks to git-hub user "@mariolorenz" -- Change Clear Logging. - -Version 3.3.2: -- Bug fix release - -Version 3.3.1: -- New New Column for invite mail in message list pane -- New Support for Thunderbird Nightly Aurora 38.0+ -- New Locale improved -- New Delegating Calendar feature -- New Auto-update from Git-hub releases -- New High priority mails with auto tagging - important - -- Changed Meetings that are canceled are removed -- Changed New Event usability issue in lightning -- Changed Priority column with updated icons,startup preference -- Changed Cache Clear on Add on Update - -- Fixed Dismissing reminder -- Fixed Accept/Tentative/Reject button appearance -- Fixed Fix Address Book freeze when attempting to view "Properties" -- Fixed Tentative status does not get saved -- Fixed Unable to forward event in Thunderbird -- Fixed Breaking other add on columns in message list pane -- Fixed UX error when saving Out of Office - -Version 3.2.0: -- changed add-on name to "Exchange EWS Provider" as it is shorter than including all the exchange versions it can connect to. -- Fixes bug where sometimes the date/time is shifted on Free/busy info in calendar of someone else. -- Added preference userAgent. User can now specify their own userAgent string to use in communication. -- Fixes Bug 277 - Cannot extend the time on a calendar event (Exchange2007) -- Improved Out Of Office text editor so it is fully HTML aware again. -- Improved memory usage. It shoud use less memory now. Please read bug 279 on https://www.1st-setup.nl/bugzilla -- Fixed Bug 287 - no folder details anymore in the ews settings of calendar -- Fixed a bug where it was not possible to create an exception. -- Update on French locale. -- Fixed Bug 291 - Modify instance of recurring meeting fails silently -- Added Access Control List functionality of Lightning to follow user rights and permissions. -- Russian translation is added. -- Fixed problem with new exchange versions of Office365 and Exchange2013. -- User can mark calendar as readonly. This state is preserved between restarts. -- Rich text editing of description (body) part for calendar items and task items. -- Fixed problem where offline cache became out of sync. -- You can click on links in the description text of invitation and read-only events/tasks - -Version 3.2.0-Beta20: -- Fixed Bug 276 - Duplicate entries, wrong hours and sometimes missing entries when viewving other calendars - -Version 3.2.0-Beta16: -- Fixed Bug 273 - Tmezone in US or Canada triggers XML error and results in HTTP 400 Bad Request. - -Version 3.2.0-Beta14: -- Received new German translation from Björn Töpper. -- Fixed some small outstanding bugs which will get mentioned when I release the final version. - -Version 3.2.0-Beta11: -- Bug 267 - Problem with upgrade from 3.1.2-bug175-3 to 3.2.0-Beta10 - -Version 3.2.0-Beta10: -- Fixed problem where the add-on would not show events and task against an Exchange2013 server. -- Changed the title of the add-on to "Exchange 2007/2010/2013 Calendar, Tasks, Contacts and GAL Provider" -- Started work on improving the progress tooltip info. -- Fixes bug 162 Changing recurring meeting to Wednesdays, moved it to Thursday - -Version 3.2.0-Beta9: -- Introduced loading/showing image when one is available for a contact (addressbook). Only works starting from Exchange server 2010_SP2 -- Fixes a bug where creation of new tasks and Event was not possible since Beta8. -- Finalized autocompletion. Depending on the connetion speed with the exchange server it can take some time to fill the autocomplete list. - -Version 3.2.0-Beta8: -- Introduced an icon which shows connection status to the exchange server. -- Introduced autocompletion. It works but could use some refinement. -- Improved CPU load when the add-on has problems connecting to the exchange server . - -Version 3.2.0-Beta6: -- Improved copying between exchange calendars and non exchange calendars. -- Fixed snooze/dismiss reminder problems for events and tasks. -- Improved UI scripts used in XUL. -- Fixes Bug 264 - Schema failure when dismissing a reminder -- Fixes Bug 261 - Number of jobs in Status Bar increasing -- Fixes Bug 255 - Complete state of tasks not working in today pane -- Fixes Bug 254 - NewEventInterfaces lists calendars twice -- Fixes Bug 253 - Import Calendar into Exchange Calendar / copy calendar items from one to another -- Fixes Bug 252 - Internal server error on reminder dismissal - -Version 3.2.0-Beta5: -- Fixed working with attachments lists in the different views/dialogs/panes -- Customized settings reminders on events and tasks according to what is possible in Exchange. -- Fixes Bug 255 - Complete state of tasks not working in today pane -- Fixes Bug 256 - Set custom reminder on task created in outlook without due or entry date not possible - -Version 3.2.0-Beta4: -- Split mivExchangeEvent object into mivExchangeEvent and mivExchangeBaseItem. As preparation for mivExchangeTodo. -- Improved the conversion from Exchange Timezone to Lightning timezone and from Lightning timezone to Exchange timezone. -- Added the Exchange task/todo detail fields. Lightning does not known about the by default. -- Fixes Bug 63 - Repeating tasks posted to Exchange Server have incorrect due date/time -- Fixes Bug 107 - Snooze state of tasks gets lost after restart -- Fixes Bug 194 - Tasks appear at wrong date -- Fixes Bug 215 - Snoozed task reminders continually pop up, dismissing task reminders takes 2 clicks of Dismiss -- Fixes Bug 235 - Try to set a task due date aways sets the current date time -- Fixes Bug 250 - No tasks with current 3.2.0 beta - -Version 3.2.0-Beta3: -- Fixes Bug 150 - Dismissing reminders asks to send update for meeting -- Fixes Bug 180 - NTLM and Kerberos fail -- Fixes bug 229 - Creating a custom repeating event - creates event on following day -- Fixes bug 238 - "All day Event" created for day prior to selected date -- Fixes bug 241 - Autodiscover RedirectAddr not followed -- Fixes bug 246 - Modifying recurring meeting resulted in "modification failed" errors -- Moved exchangecalendar object into it's own interface. -- Create our own recurrenceInfo object/interface. - -Version 3.2.0-Beta2: -- Fixes bug 241 - Autodiscover RedirectAddr not followed - -Version 3.2.0-Beta1: -- Added own ExchangeEvent Interface. With this creation of items from cache or exchange server should be faster. -- Converted handling of timezones to own interface. -- Timezone of Lightning events are set to those of Exchange. As close as possible because the timezone databases between Exchange and Lighting are not the same. -- Added new SOAP Autodiscovery functionality which is supported since Exchange2010. It will use this when available. - -Version 3.1.102: -- Fixes bug 226: No more than 20 contacts are shown. - -Version 3.1.99: -- Fixes Bug 212 - version >= 3.x leaks memory -- Fixes Bug 211 - 3.1.2 breaks login (3.1.1 working) -- Fixes Bug 188 - Adding a new Exchange 2010 EWS Calendar via add-on goes into an infinite password prompt loop -- Fixes Bug 173 - Exchange 2007/2010 Calendar and Tasks Provider deletes Outlook Calendar entries -- Fixes Bug 164 - Can not Connect to server -- Fixes Bug 159 - Thunderbird freezes -- Fixes Bug 157 - Infinity Loope for Password/Username -- Fixes Bug 143 - The adding uses wrong folder and does not fetch contacts - -Version 3.1.2: -- Fixed bug 175: After 10 calendars the jobs will hang up -- Fixed bug 201: Number of Jobs displayed in status bar is negative -- Added new loadbalancer for request to Exchange servers. You can now control the simultaneous request to the exchange server. -- Created new interface for the global functions. -- Added extra info to progress indicator. It now also uses the new loadbalancer for the statistics. - -Version 3.1.1: -- Fixed bug 205 Extension overwrites URI for non-exchange calendars - -Version 3.1.0: -- Fixed part of bug51. When emailaddress of attendee is empty do not throw an error. -- Fixed: Bug where removal of last attachment was not possible. -- Enhancement: Startup of Thunderbird has been improved. -- Fixed problem when turning off and on offlineCache. - -Version 3.0.2: -- Minor bug fix. - -Version 3.0.1: -- Fixed bug 196: Version 3.0.0-rc3 seems to interfere with address autocompletion -- Fixed bug 204: Thunderbird hangs when creating a new item with attachment -- Added automatic update functionality. This will check the developer website for new versions and give the change to autmoatically install it. - -Version 3.0.0: -- Removed all references to e4x -- Removed some bugs and stabilized the code. - -Version 3.0.0-rc4: -- Add Japanese translation. -- Added fix for new chunked message responses from Exchange server. - -Version 3.0.0-rc3: -- Optimized the code to improve speed. - -Version 3.0.0-rc2: -- Optimized the xml handling code so startup and other communications are faster. - -Version 3.0.0-rc1: -- Converted last part, editing of tasks, from e4x to xml2jxon. - -Version 3.0.0-beta4: -- Fixed problem where a reminder change (dismiss or new time) was not saved to exchange. - -Version 3.0.0-beta3: -- Fixed bug 182: Reoccuring Events keep popping up in reminder. - -Version 3.0.0-beta2: -- Fixed two parts which were not yet converted. Editing of tasks still to do. - -Version 3.0.0-beta: -- Complete rewrite of all xml handling stuff from using e4x to the new xmlToJxon object. - -Version 2.2.3: -- Fixed: bug 176 - Calendars whose names contains a slash can't be opened - -Version 2.2.2: -- Fixed: bug 160 - Meeting invitation received does not get added after accepting - -Version 2.2.1: -- Fixed bug when closing TB the offline cache would be emptyed. -- Fixed: Bug 161 - pb accessing calendars - -Version 2.2.0: -- Fixed complaint of ad-on checker. -- Fixed bug of cloning a calendar showed empty fields. - -Version 2.1.4: -- Fixed: "Unresponsive script" bug. - -Version 2.1.3: -- Fixed: Bug 52 - Incorrect sync: random calendar events missing, others duplicated - -Version 2.1.2: --Fixed: Bug 118 - Kerberos authentication broken in 1.8.11 - -Version 2.1.1: -- Fixed: Bug 151 - Email id property of exchange calendar becomes None on updating thunderbird to 13.0 -- Fixed: Bug 153 - "allday" event -> invite someone -> password request -> communication stopped -- Improved: Disabled calendars are not started on TB startup. -- Fixed: The way a calendar startup after is has been created newly. - -Version 2.1.0: -- Fixed filtering of events -- Fixed saving of the EWS settings. -- Fixed calendarReset. -- Improved getItems function. - -Version 2.0.5: -- Added: Processing of getItemsFromOfflineCache into a seperate thread. -- Fixed: Problem when turning on offline cache this would only start after restarting TB. - -Version 2.0.4: -- Fixed: bug with reminders in offline cache. -- Added: Extra dialog when answering an invitation. - -Version 2.0.2: -- Improved: Further improved Offline cache items retrieval. -- Fixed: Bug when receiving a HTTP 302 relative redirect. Because of a typo in the code it threw an exception. Possibly bug 51. - -Version 2.0.1: -- Improved: Offline cache items retrieval. - -Version 2.0.0: -- Added: Offline cache functionality. (When not connected or offline it goes into Read-Only mode) -- Added: Invitation forwarding functionality. - -Version 1.8.19: -- Fixes: problem where Out Of Office stopped working int TB12. Fix replaces the WYSIWYG editor into a flat text editor. -- Fixes: Several small bugs. - -Version 1.8.18: -- Addedd access to exchange contacts folders. (Currently READ-ONLY) -- Fixed: Problem with dismissing and snoozing alarms. -- Fixed: Problem on autodiscovery where sometimes a EWS URL select list was shown with duplicate entries. -- Fixed: Other small problems. -- Fixed: Bug 116 - Authentication fails after Thunderbird-restart -- Fixed: Bug 24 - Accepting or rejecting of invitations changes owner - -Version 1.8.16: -- Fixed: Bug 122 - New: I get "Event Invitation" email for my own meetings when I import them -- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future -- Fixed a lot of smaller bugs. - -Version 1.8.13: -- Fixed: Bug 120 - All my calendar appointments are not visible in Thunderbird -- Fixed: Bug 94 - Credentials (Username, Password) for calendars are not stored - -Version 1.8.12: -- Fixed: Bug 117 - tasks calendar shows calendar items -- Fixed: Problem where only Free/Busy information would be shown for defalt personal calendar. - -Version 1.8.6: -- Fixed: Bug 111 - No events are visible when user only has calendar permission to see Free/Busy info - -Version 1.8.5: -- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future occurrences -- Fixed: Bug 107 - Snooze state of tasks gets lost after restart -- Updated: Code for setting of alarms and snooze parameters changed completely. - -Version 1.8.4: -- Fixed: Bug 103 - aListener not defined in calExchangeCalendar -- Added: Global minimal memory cache size preferences. - -Version 1.8.3: -- fixed: Bug 102 - Extension continually asks for password - -Version 1.8.1: -- Fixed: Bug 99 - Tasks do not show up in the tasks pane/tab - -Version 1.8.0: -- Added: Full attachment functionality. -- Fixed: Bug 97 - Last month's events are missing - -Version 1.7.18: -- Fixed: Bug it is not possible to accept or decline a meeting invitation - -Version 1.7.17: -- Fixed: Bug where a HTTP 302 redirect which was called as an error was not handled correctly. -- Fixed: Bug 31 - Unable to invite attendees -- Fixed: Bug 45 - Cannot display users own calendar -- Fixed: Bug 68 - MenuItems for creating new items are disabled -- Fixed: Bug 77 - Lightening fails to save Microsoft Live Meeting style events to the Exchange calendar -- Fixed: Bug 80 - request response HTTP 302 redirect is NOT redirected and communication stops -- Fixed: Bug 82 - Copying of events from google calendar does not work -- Fixed: Bug 83 - Can't add a calendar -> HTTP-ERROR 500 -- Fixed: Bug 84 - checks performed on disabled calendars -- Fixed: Bug 85 - Can't open or save file attachments in a calendar meeting -- Fixed: Bug 86 - Invalid log path on Windows -- Added: When you try to access another person's calendar but do not have full read permissions it will switch and only tries to get Free/Busy/Tentative/OOF information. -- Added: The domainname is no longer a required field -- Added: German localization -- Added: Setting logging preferences can now be done from the TB preferences. -- Added: Exporting to ICS. Currently it only export what is has requested from the Exchange server. Default a period of one month ahead and one month back from currentdate. -- Changed: Changed default CalendarPollInterval to once every 60 seconds and InboxPollInterval to once every 180 seconds. - -Version 1.7.15: -- Fixed: Bug 59 - Exchange sends extra invitations when first one is accepted -- Fixed: Bug 32 - Unable to add event to calendar using iTIP buttons -- Fixed: Bug 33 - Accept multiple-day appointment request via iTIP creates single-day event -- Fixed: Bug 61 - Error: reference to invalid character number when trying to pull in calendar -- Fixed: Bug 62 - Moving calendar item from one calendar to another fails -- Added: Functionality to clone an Exchange Calendar. -- Fixed: Bug 19 - Event stays shown after deletion -- Fixed: Bug 66 - No workflow (accept, reject, ...) buttons are shown in invitations -- Fixed: Bug 65 - read only of calendar -- Added: New debugging preferences and possibility to create a log/debug file. -- Added: Finer info/error control in communication object. - -Version 1.7.13: -- Added: Folder properties visible in EWS Settings dialog. -- Added: Mouse cursor wait indication when browsing folders. -- Added: Add a new calendar base on the information in a share calendar invitation from someone. -- Fixed: BUG 54 Shared Calendar w/notification: error when closing -- Fixed: BUG 55 Can't set reminder for a task -- Added: Opening and saving of attachments. (ReadOnly) -- Added: Check if lightning is installed and active. When not it will show a warning. -- Added: Functionality to migrate an Exchange Provider add-on calendar to this add-on. -- Added: User can change poll interval for calendar through EWS Settings. -- Fixed: Bug 56 - Not possible to acknowledge repeating meeting -- Fixed: Small bug when importing an invitation send from a Google Calendar. It does not contain timezone information. -- Fixed: Bug 38 - Invalid security certificate -- Added: Mouse cursor wait indicatie when checking server and username on creating an calendar or changing the server settings. - - -Version 1.7.12: -- Added: Support for Seamonkey. -- Added: Access to public/shared folders without a mailbox. Only windows username, domain & password required. -- Added: You can use now a username consisting of a username part followed by ampersand (@) and full domainname and empty domain field or a username and domain field value. -- Fixed: BUG37. Alarm info on a master calendar item is not show correctly. -- Fixed: BUG41. Synching meetings with empty titles fails -- Added: French localization. -- Fixed: Bug 44 - Synchronizaton fails when a calendar item has no start date -- Fixed: Bug 39 - Accepting a meeting does not get updated in Lightning -- Added: Importing ICS file. -- Change: Changed namespacing on request of Mozilla. - - -Version 1.7.11: -- Modified: Debug log lines show more usefull information. -- Fixed: BUG 30: Accept via iTIP button fails for requests sent to distribution lists -- Improved: The processing of meeting invitations is complete. Even the iTIP buttons work. - -Version 1.7.10a3: -- Fixed an Exchange server version problem in function GetMeetingRequestByUID. It did not work correctly on Exchange 2007 - -Version 1.7.10a1: -- Fixed: BUG 28 "NL -> EN translation string" EN != "Settings voor calendar" -- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner". Meeting invitations are not yet working as wanted when using iTIP buttons. - -Version 1.7.9: -- Fixed: Meeting requests and updates to these requests were not processed in the right way. - -Version 1.7.8: -- Fixed: BUG 25 Recuring event with reminder prevents calendar refresh -- Fixed: BUG 26 Deleting a single occurrence in a sequence has no effect -- Fixed: BUG 27 Today Pane Tasks fails to show newly created tasks - -Version 1.7.7: -- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner" -- Fixed: Stabilized meeting invitations in global. Now works with distribution lists, other alias name, etc... - -Version 1.7.7a3: -- Fixed: BUG 23 "Request sent instead of Confirmation; wrong Timezone" -- Fixed: Trying to mark a task as completed gives an update error: "CompleteDate cannot be set to a date in the future." -- Fixed: Removing the completed task status through the checkbox in the task view produces an error. - -Version 1.7.7a2: -- Fixed: Could not respond to aa meeting invitation where the mailbox name was different in character Upper/Lowercase than the emailaddress in the invitation. - -Version 1.7.7a1: -- Fixed: Chagning/updating of an existing item where you are the organiser but also on the attendee list, created by outlook, gave an error. -- Added: The add-on now modifies the Exchange nextreminderdate on the Exchange server as the old Exchange provider add-on did. This is part of the merge of the add-ons. - -Version 1.7.6: -- Added: Progres indicator with tooltip. (closes BUG report 14) -- Solved: BUG 16 Cannot create event due to Time Zone error (reported by Sven) -- solved: BUG 17 Out of office retrieval of incorrect values (reported by Sven) -- Solved: When you are editing Out Of Office settings and had the externel reply window open and did a save the text for the external reply was changed by the internal reply message. -- Added: It is not possible anymore to add tasks to a calendar folder and calendaritems in a tasks folder. This would produce an error. -- Fixed: BUG 18 Changing the end or start date of an allday event produces an error. (reported by Sven) - -Version 1.7.5: -- Minor changes to keep the add-on working in version 10.0a2. -- Fixed: Problem where timezone information downloading did not work for exchange 2007. - -Version 1.7.4: -- Added: The snooze and dismiss states are saved on the exchange server so they survive a restart of TB. Was a problem when "show missed alarms" was on. (BUG 12 reported by pazz) -- Solved: Shut-down is faster. - -Version 1.7.3: -- Solved: BUG 11/ During creation of an allday event with a reminder or turning on the reminder on an existing allday event triggers an error and change is not saved. (reported by gislair) - -Version 1.7.2: -- Solved: When the windows account got locked the password manager kept asking for a password. Now after tree failed attempts it will stop asking until a restart. -- Solved: Respong to a meeting request through the iTIP buttons generated an error and did not work. - -Version 1.7.1: -- Solved: When an organiser removed a meeting which was confirmed the update in your calendar was performed every 3 seconds. - -Version 1.7.0: -- Changed: Folder browser shows different icons for different folderclass property. -- Solved: Removing a meeting in a public folder did not work an give error. -- Solved: Buttons Save and cancel in the EWS settings dialog would drop of dialog window. -- Major version changed into 1 because the add-on is feature complete. - -Version 0.7.47: -- New: Selecting the right folder below the folderbase can now be done through a folder browser. - -Version 0.7.46 -- Improved: Creation, modification and deletion of repeating events. - -Version 0.7.45 -- Solved: Removing a repeating event did not allways work. - -Version 0.7.44 -- Solved: Creating an all day event did not work anymore. - -Version 0.7.42 -- Solved: Some alarms could not be removed. -- Solved: For repeating meetings multiple alarms were shown, with same titel and date, when option show missed alarms was on in Lightning settings. -- Added: Option to automatically remove responses to meetingrequest from your inbox when you are not the organiser. -- Solved: BUG10 reported by P.Palai. - -Version 0.7.41 -- Solved: Checking/searching for certain folderpath locations did not work. -- Solved: Manipulating occurrences in a repeating meeting did not always work. -- Solved: Changing the EWS settings did not refresh the calendar and therefore the changes were not visible. - -Version 0.7.40 -- Some small changed to make shared funcitonality available to the Exchange Contacts add-on -- Meetingrequest in a non personal folder we show als invitation request to the use. Now they are not shown anymore as invitation request. -- Added different job queues for synchronization and modify actions to the EWS server. During startup changes are show earlier. - -Version 0.7.39 -- User must choose to whom invitation updates are send. -- Added a new calender folder poller which will sync by default every 10 seconds. - -Version 0.7.38 -- Changes in meetings in personal calendars will be send always to all involved persons. -- In a later version the extension will ask the user to specify what he wants (send updates or not) - -Version 0.7.37 -- Fixed problem where after an autodiscovery and server and mailbox check did not work. -- Removing a calendar will remove all settings and running processes. - -Version 0.7.36 -- Fixed a warning in the Mozilla tests. - -Version 0.7.35 -- Fixed bug (reported by Tudor Timisescu). Check for server and mailbox did not work anymore. - -Version 0.7.34 -- Added management of Out of Office settings. - -Version 0.7.33 -- Added three new options to the EWS preferences for each calendar. -- Completed list of "base folder" options. - -Version 0.7.32 -- EWS Timezome information added for Exchange2007(_SP1) servers -- Problems with allday event solved (see version 0.7.30) -- Tasks date and times are working now for different timezones. -- Version is stable for production use. - -Version 0.7.31 -- Fixed upgrade problem between versions 0.7.29 and 0.7.30 - -Version 0.7.30 -- Timezone is added correctly. There is even a difference between a 2010 or 2007 version of Exchange. -- Starting mechanism is optimized. -- A calendar reset is done completely now. -- Known problem: If you add a alldayevent EWS will add an extra day infront of it. So 1 allday becomes two. - -Version 0.7.29 -- Added the posibility to change your reaction to an invitation request in the meetingresponse screen. - -Version 0.7.28 -- Addedd extra options to the EWS Settings. - -Version 0.7.27 -- Fixed bug 6. TB becomes unresponsive on paging back in week view. - -Version 0.7.26 -- Extra settings for each calendar (poll inbox) -- Inbox poller results are better processed. -- Settings are now saved in the right location within preferences.. - -Version 0.7.22 -- Deleting of an occurrence from a string does work now. -- Alarms can be dismissed or gesnoozed. - This status is not saved between TB restarts. - This is an in memory status maintained by TB. - -Version 0.7.21 -- iTIP processing improved. - -Version 0.7.20 -- Settings and alarm on recurring appointments is better handled. - -Version 0.7.19 -- Fixed BUG 4. -- Fixed BUG 5. -- So called observers are broken down in the right way. - -Version 0.7.18 -- Fixed BUG 3. -- Alarm changing improved. - -Version 0.7.17 -- Fixed BUG 2. - -Version 0.7.16 -- Task alarms are being set in the right way. -- Dismiss or snooze the alarm of a task is working now. - -Version 0.7.15 -- Removed all storage of passwords in Memory. All password are only stored by the default Thunderbird Password Manager. - -Version 0.7.14 -- Imporved iTIP processing. - -Version 0.7.13 -- Source code cleanup. -- Exception "nsIAuthPrompt2.asyncPromptAuth" solved. -- Failures during creating connections to server are better handled. - -Version 0.7.12 -- Changed text on buttons for MessageRespons screen. -- Fixed where it was not possible to create an alldayevent. -- Dismissing an alarm will work. - -Version 0.7.11 -- Improved iTIP processing. - -Version 0.7.10 -- Fixed problem for date/time conversions. Through this problem some appointments were show on the wrong date or time. diff -Nru calendar-exchange-provider-3.9.0/install.rdf calendar-exchange-provider-4.0.0~beta4/install.rdf --- calendar-exchange-provider-3.9.0/install.rdf 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/install.rdf 2017-07-03 22:10:10.000000000 +0200 @@ -5,13 +5,13 @@ <Description about="urn:mozilla:install-manifest"> <em:id>exchangecalendar@extensions.1st-setup.nl</em:id> - <em:version>3.9.0</em:version> + <em:version>4.0.0-beta4</em:version> <em:targetApplication> <Description> <!-- Thunderbird --> <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id> <em:minVersion>12.0</em:minVersion> - <em:maxVersion>50.*</em:maxVersion> + <em:maxVersion>52.*</em:maxVersion> </Description> </em:targetApplication> @@ -20,7 +20,7 @@ <!-- Seamonkey --> <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id> <em:minVersion>2.6</em:minVersion> - <em:maxVersion>2.26.*</em:maxVersion> + <em:maxVersion>2.46.*</em:maxVersion> </Description> </em:targetApplication> @@ -30,7 +30,7 @@ You can view, delete, create and update calendar and task/todo items. And manage "Out of Office" settings. -Dutch, French, English, German, Swedish and Japanese localizations. +Dutch, French, English, German, Swedish, Japanese, Russian, Italian and Turkish localizations. Some of the icons and images used are from the Fugue Icons Collection made by Yusuke Kamiyamane (http://p.yusukekamiyamane.com/)</em:description> <em:creator>Ericsson (exchangecalendar@ericsson.com)</em:creator> @@ -42,6 +42,8 @@ <em:translator>Björn Töpper (de)</em:translator> <em:translator>Hiroshi Miura (ja-JP)</em:translator> <em:translator>Alexey Sinitsyn (ru)</em:translator> + <em:translator>Alessandro Menti (it-IT)</em:translator> + <em:translator>Engin Özkan (tr)</em:translator> <em:homepageURL>http://www.1st-setup.nl/wordpress/?page_id=133</em:homepageURL> <em:iconURL>chrome://exchangecalendar-common/skin/images/lightningexchangecalendar.png</em:iconURL> <em:type>2</em:type> <!-- type: extension --> @@ -56,7 +58,7 @@ You can view, delete, create and update calendar and task/todo items. And manage "Out of Office" settings. You can read and use contacts and global addres list contacts for address autcompletion. -Dutch, French, English, German, Swedish and Japanese localizations. +Dutch, French, English, German, Swedish, Japanese, Russian, Italian and Turkish localizations. Some of the icons and images used are from the Fugue Icons Collection made by Yusuke Kamiyamane (http://p.yusukekamiyamane.com/)</em:description> </Description> @@ -71,7 +73,7 @@ Sie können diese Kalender- und Aufgabeneinträge betrachten, löschen, erstellen und aktualisieren. Sie können die "Out of Office"-Einstellungen verwalten. Sie können Kontakte und globale Adresslisten lesen und für die Autovervollständigung der Adressen nutzen. -Übersetzungen in Niederländisch, Französisch, Deutsch Schwedisch und Japanisch. +Übersetzungen in Niederländisch, Französisch, Deutsch, Schwedisch, Japanisch, Russisch, Italienisch und Türkisch. Einige der Icons und die Bilder werden aus der Fugue Icons Collection erstellt von Yusuke Kamiyamane (http://p.yusukekamiyamane.com/) genutzt. </em:description> @@ -123,5 +125,34 @@ </Description> </em:localized> + <em:localized> + <Description> + <em:locale>it-IT</em:locale> + <em:name>Provider Exchange EWS</em:name> + <em:description>Consente di sincronizzare i propri Calendario, Attività e Contatti con un server Microsoft Exchange 2007/2010/2013 EWS da Lightning. + +È possibile visualizzare, eliminare, creare e aggiornare elementi del Calendario e Attività/Da fare e gestire le opzioni Fuori sede. +È possibile leggere e utilizzare i propri contatti e i contatti della Global Address List per l'autocompletamento degli indirizzi. + +Localizzato in olandese, francese, inglese, tedesco, svedese, giapponese e italiano. + +Alcune delle icone e immagini utilizzate sono state tratte dalla Fugue Icons Collection di Yusuke Kamiyamane (http://p.yusukekamiyamane.com/)</em:description> + </Description> + </em:localized> + + <em:localized> + <Description> + <em:locale>tr</em:locale> + <em:name>Exchange EWS Sağlayıcısı</em:name> + <em:description>Lightning içinde, Takvim, Görevler ve Kişileri Microsoft Exchange 2007/2010/2013 EWS sunucunuzla eşitlemenizi sağlar. + +Takvim ve Görev-Yapılacaklarınızdaki maddeleri görebilir ve silebilir, yeni maddeler yaratabilir ya da maddeleri güncelleyebilirsiniz. "İşyeri Dışında" ayarlarınızı da denetleyebilirsiniz. +Kişilerinizdeki ve Genel Adres Listesindeki kişileri görebilir ve automatik adres tamamlamada kullanabilirsiniz. + +Almanca, Flemenkçe, Fransızca, İngilizce, İsveççe, İtalyanca, Japonca, Rusça, ve Türkçe yerelleştirmeleri vardır. + +Bazı ikon ve imgeler, Yusuke Kamiyamane tarafından yapılmış olan Fugue Icons Collection'dan alınıp kullanılmıştır. (http://p.yusukekamiyamane.com/)</em:description> + </Description> + </em:localized> </Description> </RDF> diff -Nru calendar-exchange-provider-3.9.0/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js --- calendar-exchange-provider-3.9.0/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js 2017-07-03 22:10:10.000000000 +0200 @@ -109,8 +109,6 @@ // var realm = aRealm; var realm = "Exchange Web Service"; - //this.logInfo("getPassword: useCached:"+useCached); - if (!realm) { this.logInfo("getPassword: No realm specified. Trying to get it from the URL."); var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); @@ -129,7 +127,7 @@ if we have password from cache or manager, and we have a password in the channel. We are going to match them. Because when they are equal then the cached and stored password were wrong. Otherwise we did not get here. - When no password at al always ask. */ + When no password at all always ask. */ var password; if (this.passwordCache[username+"|"+aURL+"|"+realm]) { @@ -166,17 +164,18 @@ this.logInfo("getPassword: password(2)=********"); } - if ((password) && (aChannel) && (aChannel.URI.password) && (decodeURIComponent(aChannel.URI.password) != "")) { + if ((password) && (aChannel) && (aChannel.URI.password) + && (decodeURIComponent(aChannel.URI.password) != "")) { this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. Going to see if they are the same."); - if ((password == decodeURIComponent(aChannel.URI.password)) && (!useCached)) { + if ((password === decodeURIComponent(aChannel.URI.password)) && (!useCached)) { this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. And they are the same. Going to ask user to provide a new password."); - if ((this.details[aURL]) && (this.details[aURL].ntlmCount == 1)) { + if ((this.details[aURL]) && (this.details[aURL].ntlmCount === 1)) { this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. And they are the same. But it is a first pass on an NTLM authentication. Using stored password and going to see if it can be used."); } else { this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. And they are the same. Going to ask user to provide a new password."); var channel = aChannel.QueryInterface(Ci.nsIHttpChannel); - if( channel.responseStatus == 401 ){ + if( channel.responseStatus === 401 ){ password=null; this.logInfo("getPassword: Login Failed, Going to ask user to provide a new password."); } @@ -261,17 +260,23 @@ asyncPromptAuthNotifyCallback: function _asyncPromptAuthNotifyCallback(aURL) { if (!this.details[aURL]) { - this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have this URL '"+aURL+"' in queue"); + this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have this URL '" + + aURL + "' in queue"); return; } if (this.details[aURL].showing) { - this.logInfo("asyncPromptAuthNotifyCallback: Allready showing a prompt or trying to get the password for URL '"+aURL+"'. Not going to try again until the active one has finished."); + this.logInfo("asyncPromptAuthNotifyCallback: Already showing a prompt or trying to get the password for URL '" + + aURL + "'. Not going to try again until the active one has finished."); return; } + else { + this.details[aURL].showing = true; + } - if (this.details[aURL].queue.length == 0) { - this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have a request in queue for URL '"+aURL+"'."); + if (this.details[aURL].queue.length === 0) { + this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have a request in queue for URL '" + + aURL +"'."); return; } @@ -279,7 +284,9 @@ // We grab the first one from the queue. var request = this.details[aURL].queue.shift(); - this.logInfo("asyncPromptAuthNotifyCallback: Removed request from queue["+aURL+"]. There are now '"+this.details[aURL].queue.length+"' requests in queue left."); + this.logInfo("asyncPromptAuthNotifyCallback: Removed request from queue[" + + aURL + "]. There are now '" + + this.details[aURL].queue.length + "' requests in queue left."); var aChannel = request.channel; var aCallback = request.callback; var aContext = request.context; @@ -288,7 +295,9 @@ var canUseBasicAuth = false; if (this.details[aURL].previousFailedCount > 4) { // Maybe make this a user preference - this.logInfo("asyncPromptAuthNotifyCallback: We have more than '"+this.details[aURL].previousFailedCount+"' previous failed for '"+aURL+"'."); + this.logInfo("asyncPromptAuthNotifyCallback: We have more than '" + + this.details[aURL].previousFailedCount + "' previous failed for '" + + aURL +"'."); aCallback.onAuthCancelled(aContext, false); return; } @@ -309,7 +318,7 @@ username = this.globalFunctions.trim(decodeURIComponent(aChannel.URI.username)); } - if (username == "") { + if (username === "") { // We do not have a username. We need to prompt for one. // This should always be filled in. So for now we error. this.logInfo("asyncPromptAuthNotifyCallback: username is empty. This is not allowed."); @@ -319,25 +328,25 @@ this.logInfo("asyncPromptAuthNotifyCallback: username="+username); if (!error) { - // Trying to get realm from response header. This is used when basic authentication is available. + // Trying to get realm from response header. + // This is used when basic authentication is available. var realm = "exchange.server"; try { var acceptedAuthentications = aChannel.getResponseHeader("WWW-Authenticate"); acceptedAuthentications = acceptedAuthentications.split("\n"); - for each (var index in acceptedAuthentications) { - this.logInfo("asyncPromptAuthNotifyCallback: WWW-Authenticate:"+index); - if (index.indexOf("realm=") > -1) { - realm = index.substr(index.indexOf("realm=")+6); - while (realm.indexOf('"') > -1) { - realm = realm.replace('"', ""); - } - this.logInfo("asyncPromptAuthNotifyCallback: Found a realm going to use it. realm="+realm); + + for (let acceptAuth of acceptedAuthentications) { + this.logInfo("asyncPromptAuthNotifyCallback: WWW-Authenticate:" + acceptAuth); + if (acceptAuth.indexOf("realm=") > -1) { + realm = acceptAuth.substr(index.indexOf("realm=") + 6); + realm = realm.replace(/"/g, ""); + this.logInfo("asyncPromptAuthNotifyCallback: Found a realm going to use it. realm=" + realm); canUseBasicAuth = true; } } } catch(err) { - this.logInfo("asyncPromptAuthNotifyCallback: NO WWW-Authenticate in response header!?"); + this.logInfo("asyncPromptAuthNotifyCallback: WWW-Authenticate HTTP response header not found !"); } // try to get password. @@ -350,7 +359,7 @@ error = true; } - if ((!password) || (password == null)) { + if ((!password)) { error = true; } else { @@ -359,8 +368,8 @@ } } + // Return credentials we have obtained if (!error) { - // Return credentials we have obtained if (!(authInfo.flags & Ci.nsIAuthInformation.ONLY_PASSWORD)) { this.logInfo("asyncPromptAuthNotifyCallback: authInfo wants username and password and possibly domainname."); if (authInfo.flags & Ci.nsIAuthInformation.NEED_DOMAIN) { @@ -379,7 +388,7 @@ else { this.logInfo("asyncPromptAuthNotifyCallback: We do not have a domainname part in the username. Specifying empty one."); authInfo.username = username; - } + } } else { authInfo.username = username; @@ -416,9 +425,7 @@ } } } - - //this.details[aURL].showing = false; - + this.details[aURL].showing = false; }, asyncPromptAuthCancelCallback: function _asyncPromptAuthCallBack(aReason, aURL, aUUID) @@ -564,11 +571,11 @@ try { var acceptedAuthentications = aChannel.getResponseHeader("WWW-Authenticate"); acceptedAuthentications = acceptedAuthentications.split("\n"); - for each (var index in acceptedAuthentications) { - this.logInfo("promptAuth: WWW-Authenticate:"+index); - if (index.indexOf("realm=") > -1) { - realm = index.substr(index.indexOf("realm=")+6); - this.logInfo("promptAuth: Found a realm going to use it. realm="+realm); + for (let authenticateHeader of acceptedAuthentications) { + this.logInfo("promptAuth: WWW-Authenticate:" + authenticateHeader); + if (authenticateHeader.indexOf("realm=") > -1) { + realm = index.substr(authenticateHeader.indexOf("realm=")+6); + this.logInfo("promptAuth: Found a realm going to use it. realm=" + realm); } } } @@ -625,7 +632,7 @@ .getService(Ci.nsILoginManager); var logins = loginManager.findLogins({}, aURL, null, aRealm); - for each (var loginInfo in logins) { + for (let loginInfo of logins) { if (loginInfo.username == aUsername) { this.logInfo("passwordManagerGet found password for: username="+aUsername+", aURL="+aURL+", aRealm="+aRealm); return { result: true, password: loginInfo.password}; @@ -654,12 +661,12 @@ if (logins.length > 0) { var modified = false; - for each (let loginInfo in logins) { - if (loginInfo.username == aUsername) { + for (let loginInfo of logins) { + if (loginInfo.username === aUsername) { this.logInfo("Login credentials updated:username="+aUsername+", aURL="+aURL+", aRealm="+aRealm); loginManager.removeLogin(loginInfo); modified = true; - break; + break; } } if (!modified) { @@ -699,7 +706,7 @@ if (logins.length > 0) { var modified = false; - for each (let loginInfo in logins) { + for (let loginInfo of logins) { if (loginInfo.username == aUsername) { this.logInfo("Login credentials updated:username="+aUsername+", aURL="+aURL+", aRealm="+aRealm); loginManager.modifyLogin(loginInfo, newLoginInfo); diff -Nru calendar-exchange-provider-3.9.0/interfaces/exchangeCalendar/mivExchangeCalendar.js calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeCalendar/mivExchangeCalendar.js --- calendar-exchange-provider-3.9.0/interfaces/exchangeCalendar/mivExchangeCalendar.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeCalendar/mivExchangeCalendar.js 2017-07-03 22:10:10.000000000 +0200 @@ -5570,8 +5570,10 @@ var proposeEnd = this.tryToSetDateValue(input.proposeEnd,""); var proposeNewTime = false; - input.proposeStart = cal.toRFC3339(proposeStart.getInTimezone(this.globalFunctions.ecUTC())); - input.proposeEnd = cal.toRFC3339(proposeEnd.getInTimezone( this.globalFunctions.ecUTC())); + if (proposeStart) + input.proposeStart = cal.toRFC3339(proposeStart.getInTimezone(this.globalFunctions.ecUTC())); + if (proposeEnd) + input.proposeEnd = cal.toRFC3339(proposeEnd.getInTimezone( this.globalFunctions.ecUTC())); if( input.proposeStart && input.proposeEnd ){ proposeNewTime = true; diff -Nru calendar-exchange-provider-3.9.0/interfaces/global/mivFunctions.js calendar-exchange-provider-4.0.0~beta4/interfaces/global/mivFunctions.js --- calendar-exchange-provider-3.9.0/interfaces/global/mivFunctions.js 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/interfaces/global/mivFunctions.js 2017-07-03 22:10:10.000000000 +0200 @@ -35,7 +35,11 @@ function mivFunctions() { - //dump("\n ++ mivFunctions.init\n"); + // Mozilla helpers + this.domParser = Cc["@mozilla.org/xmlextras/domparser;1"] + .getService(Ci.nsIDOMParser); + this.xmlSerializer = Cc["@mozilla.org/xmlextras/xmlserializer;1"] + .createInstance(Ci.nsIDOMSerializer); } mivFunctions.prototype = { @@ -875,16 +879,16 @@ fromText2HTML: function _fromText2HTML(aString) { - var html = convertSpecialCharatersToXML(aString); - if (html) { - html = html.replace(/\n/g, '<br>'); - } - else { - html = ""; + let parsedHtml = null; + + if (!aString) { + aString = ""; } - return '<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></HEAD><BODY>'+html+'</BODY></HTML>'; - }, + parsedHtml = this.domParser.parseFromString(aString, 'text/html'); + + return this.xmlSerializer.serializeToString(parsedHtml); + }, } diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/calendar-event-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 @@ -1,7 +0,0 @@ -<!ENTITY exchWebService.owner.label "Besitzer:"> -<!ENTITY exchWebService.totalWork.label "Gesamtaufwand:"> -<!ENTITY exchWebService.actualWork.label "Ist-Aufwand:"> -<!ENTITY exchWebService.mileage.label "Reisekilometer:"> -<!ENTITY exchWebService.billingInformation.label "Abrechnungsinfo:"> -<!ENTITY exchWebService.companies.label "Firma:"> - diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/lightning-item-iframe.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,7 @@ +<!ENTITY exchWebService.owner.label "Besitzer:"> +<!ENTITY exchWebService.totalWork.label "Gesamtaufwand:"> +<!ENTITY exchWebService.actualWork.label "Ist-Aufwand:"> +<!ENTITY exchWebService.mileage.label "Reisekilometer:"> +<!ENTITY exchWebService.billingInformation.label "Abrechnungsinfo:"> +<!ENTITY exchWebService.companies.label "Firma:"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/calendar-event-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 @@ -1,7 +0,0 @@ -<!ENTITY exchWebService.owner.label "Owner:"> -<!ENTITY exchWebService.totalWork.label "Total work:"> -<!ENTITY exchWebService.actualWork.label "Actual work:"> -<!ENTITY exchWebService.mileage.label "Mileage:"> -<!ENTITY exchWebService.billingInformation.label "Billing information:"> -<!ENTITY exchWebService.companies.label "Company:"> - diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/lightning-item-iframe.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,7 @@ +<!ENTITY exchWebService.owner.label "Owner:"> +<!ENTITY exchWebService.totalWork.label "Total work:"> +<!ENTITY exchWebService.actualWork.label "Actual work:"> +<!ENTITY exchWebService.mileage.label "Mileage:"> +<!ENTITY exchWebService.billingInformation.label "Billing information:"> +<!ENTITY exchWebService.companies.label "Company:"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/attachments-view.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/attachments-view.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/attachments-view.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/attachments-view.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -1,2 +1,2 @@ -<!ENTITY exchWebServie.add.attachment.button.label "Attachements"> +<!ENTITY exchWebServie.add.attachment.button.label "Pièces jointes"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 @@ -1,7 +0,0 @@ -<!ENTITY exchWebService.owner.label "Responsable:"> -<!ENTITY exchWebService.totalWork.label "Temps total:"> -<!ENTITY exchWebService.actualWork.label "Temps réalisé:"> -<!ENTITY exchWebService.mileage.label "Durée:"> -<!ENTITY exchWebService.billingInformation.label "Information de facturation:"> -<!ENTITY exchWebService.companies.label "Compagnie:"> - diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -50,7 +50,7 @@ <!ENTITY exchWebServices.UserAvailability.label "Seul le status de disponibilité de l'utilsateur du calendrier de cette BAL sera visible."> -<!ENTITY exchWebServices.exchtype.label "Exchange Type"> -<!ENTITY exchWebServices.hostexch.label "Hosted Exchange"> +<!ENTITY exchWebServices.exchtype.label "Infrastructure Exchange"> +<!ENTITY exchWebServices.hostexch.label "Infrastructure Exchange dédiée"> <!ENTITY exchWebServices.365exch.label "Microsoft Office365"> -<!ENTITY exchWebServices.detail.label "Details"> +<!ENTITY exchWebServices.detail.label "Détails"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,7 @@ +<!ENTITY exchWebService.owner.label "Responsable:"> +<!ENTITY exchWebService.totalWork.label "Temps total:"> +<!ENTITY exchWebService.actualWork.label "Temps réalisé:"> +<!ENTITY exchWebService.mileage.label "Durée:"> +<!ENTITY exchWebService.billingInformation.label "Information de facturation:"> +<!ENTITY exchWebService.companies.label "Compagnie:"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/attachments-view.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/attachments-view.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/attachments-view.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/attachments-view.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,2 @@ +<!ENTITY exchWebServie.add.attachment.button.label "Allegati"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/browseFolder.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/browseFolder.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/browseFolder.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/browseFolder.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,12 @@ +<!ENTITY label.acceptbutton "Seleziona"> +<!ENTITY label.cancelbutton "Annulla"> + +<!ENTITY browsefolder.title "Sfoglia cartelle"> + +<!ENTITY treecol.label.foldername "Nome cartella"> +<!ENTITY treecol.label.folderclass "Classe cartella"> + + + + + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,5 @@ +<!ENTITY calendar.context.exchange.convert.label "Converti a componente aggiuntivo Calendario e Attività Exchange 2007/2010"> +<!ENTITY calendar.context.exchange.properties.label "Proprietà Exchange (EWS)"> +<!ENTITY calendar.context.exchange.oof.settings.label "Opzioni Fuori sede"> +<!ENTITY calendar.context.exchange.clone.settings.label "Clona opzioni in un nuovo calendario"> +<!ENTITY calendar.context.exchange.delegate.calendar.settings.label "Delega calendario"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,3 @@ +<!ENTITY forward.invite.label "Inoltra invito"> +<!ENTITY required.attendee.label "Partecipante richiesto"> +<!ENTITY optional.attendee.label "Partecipante facoltativo"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calExchangeCalendar.properties calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calExchangeCalendar.properties --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calExchangeCalendar.properties 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calExchangeCalendar.properties 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,49 @@ +displayName=Provider Calendario e Attività per Exchange 2007/2010 + +resetEventMessage=Il calendario "%1$S" è stato reimpostato. +addTaskEventMessage=Aggiunta attività "%1$S" (%2$S). +addCalendarEventMessage=Aggiunto appuntamento "%1$S" (%2$S). +ewsErrorEventMessage=Errore durante la comunicazione con il server EWS per "%1$S". Errore: %2$S, codice: %3$S. +updateCalendarEventMessage=L'appuntamento "%1$S" è stato modificato (%2$S). +updateTaskEventMessage=L'attività "%1$S" è stata modificata (%2$S). +deleteCalendarEventMessage=L'appuntamento "%1$S" è stato rimosso (%2$S). +deleteTaskEventMessage=L'attività "%1$S" è stata rimossa (%2$S). +syncFolderEventMessage="%4$S": ricevuti aggiornamenti dal server EWS (nuovi: %1$S, modificati: %2$S, eliminati: %3$S). +syncInboxRequests="%4$S": ricevuti aggiornamenti inviti a riunione dal server EWS nella Posta in arrivo (nuovi: %1$S, modificati: %2$S, eliminati: %3$S). +syncInboxCancelations="%4$S": ricevuti annullamenti inviti a riunione dal server EWS nella Posta in arrivo (nuovi: %1$S, modificati: %2$S, eliminati: %3$S). +syncInboxResponses="%4$S": ricevuti aggiornamenti risposte riunione dal server EWS nella Posta in arrivo (nuovi: %1$S, modificati: %2$S, eliminati: %3$S). +ewsMeetingResponsEventMessage=Risposta "%2$S" ricevuta per la richiesta riunione "%1$S" (%3$S). Messaggio: + +ecErrorServerCheck=Errore durante il controllo sul server: %1$S (%2$S) +ecErrorAutodiscovery=Errore durante la ricerca automatica: %1$S (%2$S) +ecErrorAutodiscoveryURLInvalid=Non è stato possibile determinare le impostazioni tramite la ricerca automatica utilizzando la parte nome di dominio della casella di posta (%1$S).\nSolitamente ciò significa che non esiste un server ricerca automatica definito con la parte di dominio come nome host. +ecErrorServerCheckURLInvalid=Il server "%1$S" non esiste. +ecErrorServerAndMailboxCheck=Errore durante il controllo del server e della casella di posta: %1$S (codice: %2$S) + +updateUserPrefs1=Opzioni utente aggiornate per la nuova versione (dalla 0.7.26) + +autoRemoveConfirmedInvitationOnCancellation=L'appuntamento confermato "%1$S" è stato annullato ed è stato rimosso automaticamente come specificato dalle opzioni utente (%2$S). + +sendAutoRespondMeetingRequestMessage=È stata automaticamente inviata una risposta alla richiesta di riunione "%1$S" come specificato dalle opzioni utente (%2$S). + +ecLoadingOofSettings=(Recupero dati in corso) +ecLoadedOofSettings=(Dati recuperati) +ecErrorLoadingOofSettings=Errore durante il caricamento delle opzioni Fuori sede. Codice: %2$S, messaggio: %1$S. +ecSavingOofSettings=(Salvataggio dati in corso) +ecSavedOofSettings=(Dati salvati) +ecErrorSavingOofSettings=Errore durante il salvataggio delle opzioni Fuori sede. Codice: %2$S, messaggio: %1$S. + + +exchWebService.PidLidTaskHistory.duedate.changed=La data di scadenza è stata modificata +exchWebService.PidLidTaskHistory.some.property.changed=È stata modificata una proprietà +exchWebService.PidLidTaskHistory.accepted=Attività accettata da %1$S +exchWebService.PidLidTaskHistory.rejected=Attività rifiutata da %1$S +exchWebService.PidLidTaskHistory.assigned=Attività assegnata a %1$S +exchWebService.PidLidTaskHistory.no.changes=Nessuna modifica + +ecErrorServerAndMailboxCheckFolderNotFound=Non si dispone delle autorizzazioni di lettura sulla casella di posta selezionata o la casella di posta non è corretta.\n\nDopo che la casella di posta sarà stata corretta si potrebbe disporre delle autorizzazioni di visualizzazione dello stato di disponibilità utente (occupato/provvisorio/fuori sede) per il suo calendario.\n\n(%2$S: %1$S) + +tooltipCalendarDisconnected=Il calendario %1$S non è connesso al server Exchange\n(Motivo: %2$S). +tooltipCalendarDisconnectedReadOnly=Il calendario %1$S non è connesso al server Exchange ed è in sola lettura\n(Motivo: %2$S). +tooltipCalendarConnected=Il calendario %1$S è connesso al server Exchange. +tooltipCalendarConnectedReadOnly=Il calendario %1$S è connesso al server Exchange ed è in sola lettura. diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,25 @@ + +<!ENTITY label.delegateCalendar.cancelbutton "Annulla"> +<!ENTITY label.delegateCalendar.userEmail "Indirizzo di posta elettronica"> +<!ENTITY label.delegateCalendar.deliveryMeetingRerquestControl "Recapita richieste riunione"> + +<!ENTITY menuitem.delegateCalendar.deliverMeetingRequestslist.delegateOnly "Solo ai delegati"> +<!ENTITY menuitem.delegateCalendar.deliverMeetingRequestslist.delegateAndMe "Ai delegati e a me"> +<!ENTITY menuitem.delegateCalendar.deliverMeetingRequestslist.delegateAndInfo "Ai delegati e inviami le notifiche"> + +<!ENTITY label.delegateCalendar.permission "Autorizzazioni"> +<!ENTITY menuitem.delegateCalendar.permission.author "Autore"> +<!ENTITY menuitem.delegateCalendar.permission.editor "Editor"> +<!ENTITY menuitem.delegateCalendar.permission.reviewer "Revisore"> +<!ENTITY menuitem.delegateCalendar.permission.none "Nessuno"> + +<!ENTITY label.delegateCalendar.permission.receiveInvitationCopy "Ricevi copie dei messaggi riunione" > +<!ENTITY label.delegateCalendar.permission.viewPrivateItems "Visualizza elementi privati" > + + +<!ENTITY delegateCalendar.permission.description.author "Leggi e crea elementi nella cartella Calendario." > +<!ENTITY delegateCalendar.permission.description.editor "Leggi, crea e modifica elementi nella cartella Calendario." > +<!ENTITY delegateCalendar.permission.description.reviewer "Leggi elementi nella cartella Calendario." > +<!ENTITY delegateCalendar.permission.description.none "Nessuna autorizzazione di accesso alla cartella Calendario." > + +<!ENTITY delegateCalendar.permission.details.label "Dettagli autorizzazioni: " > diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-folder.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-folder.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-folder.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-folder.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,45 @@ + +<!ENTITY label.delegatefolder.cancelbutton "Annulla"> +<!ENTITY label.delegatefolder.userEmail "Indirizzo di posta elettronica"> + +<!ENTITY label.delegatefolder.permissionLevel "Livello autorizzazioni"> +<!ENTITY label.delegatefolder.userboxcolumn1 "Utente"> +<!ENTITY label.delegatefolder.userboxcolumn2 "Permessi"> + +<!ENTITY menuitem.delegatefolder.permission.author "Autore"> +<!ENTITY menuitem.delegatefolder.permission.editor "Editor"> +<!ENTITY menuitem.delegatefolder.permission.reviewer "Revisore"> +<!ENTITY menuitem.delegatefolder.permission.none "Nessuno"> +<!ENTITY menuitem.delegatefolder.permission.owner "Proprietario" > +<!ENTITY menuitem.delegatefolder.permission.publishingEditor "Supervisore pubblicazione" > +<!ENTITY menuitem.delegatefolder.permission.publishingAuthor "Autore pubblicazione" > +<!ENTITY menuitem.delegatefolder.permission.noneditingAuthor "Autore nonediting" > +<!ENTITY menuitem.delegatefolder.permission.contributor "Collaboratore" > +<!ENTITY menuitem.delegatefolder.permission.custom "Personalizzato" > + +<!ENTITY delegatefolder.permission.description.author "Leggi e crea elementi nella cartella." > +<!ENTITY delegatefolder.permission.description.editor "Leggi, crea e modifica elementi nella cartella." > +<!ENTITY delegatefolder.permission.description.reviewer "Leggi elementi nella cartella." > +<!ENTITY delegatefolder.permission.description.none "Nessuna autorizzazione di accesso alla cartella." > + +<!ENTITY delegatefolder.permission.details.caption "Autorizzazioni "> + +<!ENTITY delegatefolder.tab.msg.label "Calendario e Attività non trovati per questo account di posta."> +<!ENTITY delegatefolder.tab.name "Condivisione cartelle Exchange"> + +<!ENTITY delegatefolder.permissions.none "Nessuno"> +<!ENTITY delegatefolder.permissions.own "Propri elementi"> +<!ENTITY delegatefolder.permissions.all "Tutti gli elementi"> +<!ENTITY delegatefolder.permissions.full "Dettagli completi"> + +<!ENTITY delegatefolder.permissions.cancreateitems "Creazione elementi"> +<!ENTITY delegatefolder.permissions.cancreatesubfolders "Creazione sottocartelle"> +<!ENTITY delegatefolder.permissions.isfolderowner "Proprietario cartella"> +<!ENTITY delegatefolder.permissions.isfoldervisible "Cartella visibile"> +<!ENTITY delegatefolder.permissions.isfoldercontact "Cartella contatti"> +<!ENTITY delegatefolder.permissions.edititems "Modifica elementi"> +<!ENTITY delegatefolder.permissions.deleteitems "Eliminazione elementi"> +<!ENTITY delegatefolder.permissions.readitems "Lettura elementi"> + +<!ENTITY delegatefolder.permissions.true "Vero"> +<!ENTITY delegatefolder.permissions.false "Falso"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,5 @@ +<!ENTITY exchange1.description "Opzioni Exchange/Windows Active Directory"> +<!ENTITY exchange.cache.label "Utilizza cache offline"> + + + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,6 @@ +<!ENTITY label.acceptbutton "Salva"> +<!ENTITY label.cancelbutton "Annulla"> + +<!ENTITY label.ecExchangeSettings.title "Nuova descrizione:"> + + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,4 @@ +<!ENTITY exchWebService.reminder.relation.origin.label "prima dell'inizio dell'evento"> + + + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettings.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettings.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettings.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettings.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,54 @@ +<!ENTITY label.acceptbutton "Salva e reimposta"> +<!ENTITY label.cancelbutton "Annulla"> +<!ENTITY ecsettings.title "Opzioni Calendario e Posta EWS"> +<!ENTITY ecsettings.tab.adsettings "Exchange/AD Windows"> +<!ENTITY ecsettings.tab.meetingrequestsettings "Richieste riunione"> +<!ENTITY ecsettings.tab.calendarfolderproperties "Proprietà cartella"> + +<!ENTITY label.ecExchangeSettings.title "Opzioni per il calendario:"> + +<!ENTITY label.poll.inbox "Esegui il polling della Posta in arrivo per gestire richieste, modifiche e annullamenti."> +<!ENTITY label.poll.inbox.interval "Frequenza di polling Posta in arrivo (in secondi):"> +<!ENTITY label.poll.calendar.interval "Frequenza di polling Calendario (in secondi):"> + +<!ENTITY label.nomeetingrequestsettings "Impossibile impostare la richiesta riunione perché non si è selezionato il calendario principale per la casella di posta"> + +<!ENTITY label.autorespond.meetingrequest "Rispondi automaticamente a un nuovo invito con "> + +<!ENTITY menuitem.label.ec-autorespond-answer.tentative "Forse parteciperò"> +<!ENTITY menuitem.label.ec-autorespond-answer.accepted "Parteciperò"> +<!ENTITY menuitem.label.ec-autorespond-answer.declined "Non parteciperò"> + +<!ENTITY label.autoremove.invitation_cancellation1 "Rimuovi automaticamente l'invito e il messaggio di annullamento abbinato se non si è ancora risposto all'invito."> +<!ENTITY label.autoremove.invitation_cancellation2 "Rimuovi automaticamente un invito confermato quando si riceve un messaggio di annullamento."> + +<!ENTITY label.autoremove.invitation_response1 "Rimuovi automaticamente una risposta di terzi a un invito di cui non si è l'organizzatore."> + +<!ENTITY label.doautorespond.meetingrequest.message "Invia il seguente messaggio con le risposte anziché richiedere un messaggio."> +<!ENTITY label.autorespond.meetingrequest.message "Messaggio:"> + +<!ENTITY treecol.label.userid "Nome utente"> +<!ENTITY treecol.label.email "Indirizzo di posta elettronica"> + + +<!ENTITY ecsettings.tab.offlineCachingproperties "Cache non in linea"> + +<!ENTITY label.offlineCacheproperties.cachingStartDate "Data di inizio cache:"> +<!ENTITY label.offlineCacheproperties.cachingEndDate "Data di fine cache:"> +<!ENTITY label.offlineCacheproperties.totalEvents "Numero totale di eventi in cache:"> +<!ENTITY label.offlineCacheproperties.totalTasks "Numero totale di attività in cache:"> + +<!ENTITY label.offlineCacheproperties.monthsBeforeStartDate "Numero di mesi prima di oggi per cui mantenere gli elementi in cache:"> +<!ENTITY label.offlineCacheproperties.monthsBeforeEndDate "Numero di mesi dopo di oggi per cui mantenere gli elementi in cache:"> + +<!ENTITY button.offlineCacheproperties.clearCache "Elimina dati nella cache non in linea"> +<!ENTITY ecsettings.tab.autoprocessingproperties "Elaborazione automatica"> +<!ENTITY ecsettings.tab.mailitemsProperties "Opzioni EWS (Posta)"> + +<!ENTITY label.syncmailitems.interval "Ritarda sincronizzazione elementi di posta (tag, ecc.)"> +<!ENTITY label.autoprocessingproperties.deletecancelleditems "Rimuovi automaticamente eventi annullati"> +<!ENTITY label.autoprocessingproperties.markeventtentative "Contrassegna automaticamente gli eventi come provvisori e invia la risposta all'organizzatore"> +<!ENTITY label.syncmailitems.active "Mantieni attiva la sincronizzazione degli elementi di posta (tag, ecc.)"> + +<!ENTITY label.syncfollowup.deactivtate "Disabilita Contrassegna attività per il completamento"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,56 @@ +<!ENTITY ecautodiscover "Utilizza funzionalità ricerca automatica di Exchange."> +<!ENTITY ecfolderbase.label "Cartella base:"> +<!ENTITY ecfolderpath.label "Percorso entro la cartella base:"> +<!ENTITY ecfolderidofshare.label "ID cartella condivisa:"> +<!ENTITY exchWebServices.SharedFolderID.label "Nome visualizzato cartella condivisa:"> + +<!ENTITY menuitem.label.ecfolderbase.calendar "Cartella Calendario"> +<!ENTITY menuitem.label.ecfolderbase.publicfoldersroot "Cartelle pubbliche"> +<!ENTITY menuitem.label.ecfolderbase.inbox "Cartella Posta in arrivo"> +<!ENTITY menuitem.label.ecfolderbase.voicemail "Cartella Segreteria telefonica"> +<!ENTITY menuitem.label.ecfolderbase.msgfolderroot "Radice cartella messaggi"> +<!ENTITY menuitem.label.ecfolderbase.root "Radice casella di posta"> +<!ENTITY menuitem.label.ecfolderbase.tasks "Cartella Attività"> + +<!ENTITY menuitem.label.ecfolderbase.contacts "Cartella Contatti"> +<!ENTITY menuitem.label.ecfolderbase.deleteditems "Cartella Elementi eliminati"> +<!ENTITY menuitem.label.ecfolderbase.drafts "Cartella Bozze"> +<!ENTITY menuitem.label.ecfolderbase.journal "Cartella Diario"> +<!ENTITY menuitem.label.ecfolderbase.notes "Cartella Note"> +<!ENTITY menuitem.label.ecfolderbase.outbox "Cartella Posta in uscita"> +<!ENTITY menuitem.label.ecfolderbase.sentitems "Cartella Posta inviata"> +<!ENTITY menuitem.label.ecfolderbase.junkemail "Cartella Posta indesiderata"> +<!ENTITY menuitem.label.ecfolderbase.searchfolders "Cartella Ricerca cartelle"> +<!ENTITY menuitem.label.ecfolderbase.version2010 "-- Le opzioni sottostanti sono valide solo per Exchange 2010 --"> +<!ENTITY menuitem.label.ecfolderbase.recoverableitemsroot "Cartella radice Elementi ripristinabili"> +<!ENTITY menuitem.label.ecfolderbase.recoverableitemsdeletions "Cartella Eliminazioni in Elementi ripristinabili"> +<!ENTITY menuitem.label.ecfolderbase.recoverableitemsversion "Cartella Versioni in Elementi ripristinabili"> +<!ENTITY menuitem.label.ecfolderbase.recoverableitemspurges "Cartella Elimina in Elementi ripristinabili"> +<!ENTITY menuitem.label.ecfolderbase.archiveroot "Cartella radice Archivio"> +<!ENTITY menuitem.label.ecfolderbase.archivemsgfolderroot "Cartella radice messaggi Archivio"> +<!ENTITY menuitem.label.ecfolderbase.archivedeleteditems "Cartella Elementi eliminati Archivio"> +<!ENTITY menuitem.label.ecfolderbase.archiverecoverableitemsroot "Cartella radice Elementi ripristinabili - Archivio"> +<!ENTITY menuitem.label.ecfolderbase.Archiverecoverableitemsdeletions "Cartella Eliminazioni in Elementi ripristinabili - Archivio"> +<!ENTITY menuitem.label.ecfolderbase.Archiverecoverableitemsversions "Cartella Versioni in Elementi ripristinabili - Archivio"> +<!ENTITY menuitem.label.ecfolderbase.Archiverecoverableitemspurges "Cartella Elimina in Elementi ripristinabili - Archivio"> + +<!ENTITY button.label.autodiscovercheck "Esegui ricerca automatica"> +<!ENTITY button.label.serverandmailboxcheck "Controlla server e casella di posta"> +<!ENTITY button.label.servercheck "Controlla server e account"> + +<!ENTITY ecmailbox.label "Indirizzo di posta elettronica principale:"> +<!ENTITY ecmailbox.tooltip "Non specificando una casella di posta si sarà in grado di accedere solamente alle cartelle pubbliche."> +<!ENTITY ecwindowsuser.label "Nome utente:"> +<!ENTITY ecwindowsdomain.label "Nome dominio:"> +<!ENTITY ecwindowspassword.label "Password:"> + +<!ENTITY button.label.folderpathcheck "Controlla"> +<!ENTITY button.label.folderbrowse "Sfoglia"> + +<!ENTITY exchWebServices.UserAvailability.label "Per il calendario della casella di posta sarà visibile unicamente lo stato di disponibilità utente."> + +<!ENTITY exchWebServices.exchtype.label "Tipo Exchange"> +<!ENTITY exchWebServices.hostexch.label "Exchange hosted"> +<!ENTITY exchWebServices.365exch.label "Microsoft Office 365"> +<!ENTITY exchWebServices.detail.label "Dettagli"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/extra-priority.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/extra-priority.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/extra-priority.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/extra-priority.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,18 @@ +<!ENTITY prefwindow.title "Opzioni aggiuntive"> +<!ENTITY general.label "Generale"> +<!ENTITY about.label "Informazioni su"> + +<!ENTITY about.description.label "Funzionalità avanzate per Thunderbird e SeaMonkey"> +<!ENTITY iconify.label "Visualizza solo icone priorità"> +<!ENTITY shadeHigh.label "Aggiungi un colore di sfondo ai messaggi con priorità alta"> +<!ENTITY shadeLow.label "Aggiungi un colore di sfondo ai messaggi con priorità bassa"> +<!ENTITY tagImportant.label "Contrassegna automaticamente i messaggi con priorità alta come Importante"> + +<!ENTITY highestColor.label "Massima"> + +<!ENTITY highColor.label "Alta"> +<!ENTITY lowColor.label "Bassa"> +<!ENTITY lowestColor.label "Minima"> + +<!ENTITY prioritycolor "Colore personalizzato"> +<!ENTITY pref.color "Opzioni colore:"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/invitationResponse.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/invitationResponse.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/invitationResponse.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/invitationResponse.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,20 @@ +<!ENTITY label.acceptbutton "Conferma modifica"> +<!ENTITY label.cancelbutton "Annulla modifica"> + +<!ENTITY description.invitationResponse "Conferma la modifica della risposta per la riunione."> + +<!ENTITY label.calendarName "Calendario:"> +<!ENTITY label.itemTitle "Oggetto:"> +<!ENTITY label.itemStart "Ora di inizio:"> +<!ENTITY label.itemResponse "Risposta:"> +<!ENTITY label.meetingOrganiser "Organizzatore:"> + +<!ENTITY label.messageReponseBody "Messaggio risposta:"> + +<!ENTITY menuitem.label.ec-autorespond-answer.tentative "Forse parteciperò"> +<!ENTITY menuitem.label.ec-autorespond-answer.accepted "Parteciperò"> +<!ENTITY menuitem.label.ec-autorespond-answer.declined "Non parteciperò"> + +<!ENTITY label.proposenewtime.title "Proponi nuovo orario (Exchange 2013 o successivo)"> +<!ENTITY label.proposenewtime.start "Ora di inizio"> +<!ENTITY label.proposenewtime.end "Ora di fine"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/inviteStyle.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/inviteStyle.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/inviteStyle.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/inviteStyle.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,2 @@ +<!ENTITY label.inviteCol "Invito a calendario"> +<!ENTITY tooltip.inviteCol "Ordina per invito"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,7 @@ +<!ENTITY exchWebService.owner.label "Proprietario:"> +<!ENTITY exchWebService.totalWork.label "Lavoro totale:"> +<!ENTITY exchWebService.actualWork.label "Lavoro effettivo:"> +<!ENTITY exchWebService.mileage.label "Chilometraggio:"> +<!ENTITY exchWebService.billingInformation.label "Informazioni di fatturazione:"> +<!ENTITY exchWebService.companies.label "Azienda:"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,16 @@ +<!ENTITY label.acceptbutton "Chiudi"> + +<!ENTITY exchWebService.manageEWSAccounts.newAccount.button "Aggiungi account"> +<!ENTITY exchWebService.manageEWSAccounts.removeAccount.button "Rimuovi account"> +<!ENTITY exchWebService.manageEWSAccounts.saveAccount.button "Salva impostazioni"> + +<!ENTITY exchWebService.manageEWSAccounts.autodiscover.label "Utilizza la funzionalità di ricerca automatica di Exchange."> +<!ENTITY exchWebService.manageEWSAccounts.mailbox.label "Nome casella di posta:"> +<!ENTITY exchWebService.manageEWSAccounts.windowsuser.label "Nome utente:"> +<!ENTITY exchWebService.manageEWSAccounts.windowsdomain.label "Nome dominio:"> +<!ENTITY exchWebService.manageEWSAccounts.autodiscover.button "Esegui ricerca automatica"> +<!ENTITY exchWebService.manageEWSAccounts.servercheck.button "Controlla server e account"> +<!ENTITY exchWebService.manageEWSAccounts.name.label "Nome:"> + +<!ENTITY exchWebService.manageEWSAccounts.menuitem "Account Exchange Web Services"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,6 @@ +<!ENTITY exchWebService.task.delegation.owner.name "Proprietario attività"> +<!ENTITY exchWebService.task.delegation.delegator.name "Delegato attività"> +<!ENTITY exchWebService.task.delegation.accept.button "Accetta"> +<!ENTITY exchWebService.task.delegation.decline.button "Rifiuta"> +<!ENTITY exchWebService.task.delegation.lastUpdateDate "Ultima modifica"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/oofSettings.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/oofSettings.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/oofSettings.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/oofSettings.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,26 @@ +<!ENTITY title.oofsettings "Opzioni Fuori sede"> +<!ENTITY label.acceptbutton "Salva"> +<!ENTITY label.cancelbutton "Chiudi"> +<!ENTITY label.oofsettings.title "Opzioni Fuori sede per:"> + +<!ENTITY label.oofstatus "Stato Fuori sede:"> + +<!ENTITY label.externalaudience "Persone esterne a cui inviare messaggi Fuori sede: "> +<!ENTITY menuitem.label.exchWebService-oof-externalaudience.none "Nessuno"> +<!ENTITY menuitem.label.exchWebService-oof-externalaudience.known "Solo persone nel mio elenco contatti"> +<!ENTITY menuitem.label.exchWebService-oof-externalaudience.all "Tutti"> + +<!ENTITY button.label.internal "Messaggio interno"> +<!ENTITY button.label.external "Messaggio esterno"> +<!ENTITY label.internalreply "Messaggio che sarà inviato alle persone nella propria impresa:"> +<!ENTITY label.externalreply "Messaggio che sarà inviato alle persone al di fuori della propria impresa:"> + +<!ENTITY menuitem.label.exchWebService-oof-status.disabled "Disabilitato"> +<!ENTITY menuitem.label.exchWebService-oof-status.enabled "Abilitato"> + +<!ENTITY checkbox.label.exchWebService-oof-scheduled "Abilitato solo nell'intervallo temporale specificato:"> +<!ENTITY label.hbox-oof-scheduled-startTime "Ora di inizio:"> +<!ENTITY label.hbox-oof-scheduled-endTime "Ora di fine:"> + + + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preferences.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preferences.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preferences.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preferences.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,48 @@ +<!ENTITY exchangeWebService.paneAccounts.title "Exchange (EWS)"> +<!ENTITY exchangeWebService.paneDebug.title "Registrazione eventi"> + +<!ENTITY exchangeWebService.preferences.tab.accounts "Account"> +<!ENTITY exchangeWebService.preferences.tab.debug "Registrazione eventi"> +<!ENTITY exchangeWebService.preference.debug.file "Percorso file di log:"> +<!ENTITY exchangeWebService.preference.network.debug.caption "Comunicazioni con il server Exchange:"> +<!ENTITY exchangeWebService.preference.debug.log.label "Registra informazioni sulla console e/o su un file"> +<!ENTITY exchangeWebService.preference.debug.file.button "Sfoglia"> +<!ENTITY exchangeWebService.preference.network.debug.label "Registra comunicazioni con il server Exchange"> +<!ENTITY exchangeWebService.preference.network.debuglevel.label1 "Livello di log"> +<!ENTITY exchangeWebService.preference.network.debuglevel.label2 "1 = informazioni di base, 2 = comunicazioni integrali"> +<!ENTITY exchangeWebService.preference.authentication.debug.label "Registra informazioni sull'avanzamento delle comunicazioni (ad es. autenticazione)"> +<!ENTITY exchangeWebService.preference.authentication.showpassword.label "Visualizza la password come testo in chiaro nel file di log."> + +<!ENTITY exchangeWebService.preference.contacts.debug.caption "Rubrica/Contatti:"> +<!ENTITY exchangeWebService.preference.contacts.debuglevel.label1 "Livello di log"> +<!ENTITY exchangeWebService.preference.contacts.debuglevel.label2 "1 = informazioni di base, 2 = comunicazioni integrali"> +<!ENTITY exchangeWebService.preference.contacts.debug.label "Registra informazioni relative alla Rubrica/Contatti"> + +<!ENTITY exchangeWebService.preferences.titleWin "Opzioni Exchange (EWS)"> + +<!ENTITY exchangeWebService.preference.core.debug.caption "Oggetto core provider:"> +<!ENTITY exchangeWebService.preference.core.debuglevel.label2 "0 = nessuna informazione, 1 = informazioni di base, 2 = comunicazioni integrali"> + +<!ENTITY exchangeWebService.preferences.tab.cache "Caching"> +<!ENTITY exchangeWebService.preference.cache.memory.label "Cache minimale temporanea in memoria"> +<!ENTITY exchangeWebService.preference.cache.memory.startupBefore.label "Numero di giorni di cui scaricare i dati prima della data di avvio del programma:"> +<!ENTITY exchangeWebService.preference.cache.memory.startupAfter.label "Numero di giorni di cui scaricare i dati dopo la data di avvio del programma:"> + +<!ENTITY exchangeWebService.preferences.tab.others "Altro"> +<!ENTITY exchangeWebService.preference.others.prefs.label "Opzioni comunicazioni:"> +<!ENTITY exchangeWebService.preference.others.prefs.retryCount.label "Numero massimo di tentativi per le comunicazioni con Exchange:"> + +<!ENTITY exchangeWebService.preference.updateFunction.label "Funzionalità aggiornamento componente aggiuntivo:"> +<!ENTITY exchangeWebService.preference.checkForUpdates.label "Controlla automaticamente la disponibilità di una nuova versione del componente aggiuntivo su Internet all'avvio di Thunderbird."> +<!ENTITY exchangeWebService.preference.warnForUpdates.label "Visualizza un avviso se una nuova versione è disponibile per consentirne un'installazione facile."> +<!ENTITY exchangeWebService.preference.warnForPrereleaseUpdates.label "Visualizza un avviso se una nuova versione non definitiva (beta, RC, ecc.) è disponibile."> + +<!ENTITY exchangeWebService.preference.loadbalancer.debug.caption "Bilanciamento del carico:"> +<!ENTITY exchangeWebService.preference.loadbalancer.prefs.label "Bilanciamento del carico:"> +<!ENTITY exchangeWebService.preference.loadbalancer.prefs.maxJobs.label "Numero massimo di richieste contemporanee al server Exchange:"> +<!ENTITY exchangeWebService.preference.loadbalancer.prefs.sleepBetweenJobs.label "Tempo minimo di attesa fra richieste al server Exchange:"> +<!ENTITY exchangeWebService.preference.userAgent.label "Agente utente HTTP:"> + +<!ENTITY exchangeWebService.preference.ntlmv1.label "Opzioni NTLM-v1:"> +<!ENTITY exchangeWebService.preference.ntlmv1.true.label "Abilita"> +<!ENTITY exchangeWebService.preference.ntlmv1.false.label "Disabilita"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preInvitationResponse.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preInvitationResponse.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preInvitationResponse.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preInvitationResponse.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,14 @@ +<!ENTITY dialog.exchWebService.preInvitationResponse.title "Come si desidera rispondere?"> +<!ENTITY label.acceptbutton "OK"> +<!ENTITY label.cancelbutton "Annulla"> + +<!ENTITY label.calendarName "Calendario:"> +<!ENTITY label.itemTitle "Oggetto:"> +<!ENTITY label.itemStart "Ora di inizio:"> +<!ENTITY label.itemResponse "Risposta:"> +<!ENTITY label.meetingOrganiser "Organizzatore:"> + +<!ENTITY radio.label.exchWebService.preInvitationResponse.edit "Modifica la risposta prima di inviarla."> +<!ENTITY radio.label.exchWebService.preInvitationResponse.sendnow "Invia la risposta ora."> +<!ENTITY radio.label.exchWebService.preInvitationResponse.donotsend "Non inviare una risposta."> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,15 @@ + <!ENTITY rtews.selectaccountdesc "Selezionare l'account di posta elettronica da configurare. L'account deve essere basato su Microsoft Exchange"> + <!ENTITY rtews.accconfigured "Account già configurato"> + <!ENTITY rtews.dicoverdesc "È possibile scegliere di ricercare automaticamente l'URL del server Microsoft Exchange (EWS) URL o configurarlo manualmente"> + <!ENTITY rtews.dicoverdesc2 "Per configurarlo manualmente, immettere l'URL nel campo sottostante."> + <!ENTITY rtews.autodiscover "Ricerca automatica"> + <!ENTITY rtews.doautodicover "Esegui ricerca automatica"> + <!ENTITY rtews.manual "Manuale"> + <!ENTITY rtews.test "Fare clic qui per verificare l'URL EWS"> + <!ENTITY rtews.msexchewsurl "URL EWS Microsoft Exchange EWS verificato. Cliccare Fine per completare la configurazione"> + <!ENTITY rtews.selectaccount "Seleziona account"> + <!ENTITY rtews.configure.label "Configura..."> + <!ENTITY rtews.rtforexch "Contrassegni remoti per Microsoft Exchange"> + <!ENTITY rtews.confirmAccDetail "Confermare i seguenti dettagli dell'account"> + <!ENTITY rtews.username "Nome utente"> + <!ENTITY rtews.domain "Dominio"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.properties calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.properties --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.properties 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.properties 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,2 @@ +rtews.title=EWStagger +rtews.tagAddError=Si è verificato un errore durante la creazione del tag per la categoria diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/selectEWSUrl.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/selectEWSUrl.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/selectEWSUrl.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/selectEWSUrl.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,9 @@ +<!ENTITY label.acceptbutton "Seleziona"> +<!ENTITY label.cancelbutton "Annulla"> + +<!ENTITY description.selectews "Selezionare dall'elenco un server EWS adatto alla posizione corrente."> +<!ENTITY label.selectews "Elenco server EWS:"> + + + + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sendUpdateTo.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sendUpdateTo.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sendUpdateTo.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sendUpdateTo.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,9 @@ +<!ENTITY title.sendupdateto "A chi dev'essere inviato quest'aggiornamento?"> +<!ENTITY label.acceptbutton "Esegui"> +<!ENTITY label.cancelbutton "Annulla"> +<!ENTITY label.calendaritem.title "Invia aggiornamento per la riunione:"> + +<!ENTITY radio.label.sendtonone "Non inviare l'aggiornamento a nessuno."> +<!ENTITY radio.label.sendtoall "Invia l'aggiornamento a tutti gli invitati."> +<!ENTITY radio.label.sendtochanged "Invia l'aggiornamento solo alle persone aggiunte o rimosse."> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,3 @@ +<!ENTITY exchWebService_vbox_label "Rilevato invito condivisione Exchange"> +<!ENTITY exchWebService_button_label_add_calendar "Aggiungi calendario"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/timezonePreference.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/timezonePreference.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/timezonePreference.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/timezonePreference.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1 @@ +<!ENTITY calendar.timezone.local.auto.label "Modifica fuso orario automaticamente"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 @@ -1,7 +0,0 @@ -<!ENTITY exchWebService.owner.label "Owner:"> -<!ENTITY exchWebService.totalWork.label "Total work:"> -<!ENTITY exchWebService.actualWork.label "Actual work:"> -<!ENTITY exchWebService.mileage.label "Mileage:"> -<!ENTITY exchWebService.billingInformation.label "Billing information:"> -<!ENTITY exchWebService.companies.label "Company:"> - diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,7 @@ +<!ENTITY exchWebService.owner.label "Owner:"> +<!ENTITY exchWebService.totalWork.label "Total work:"> +<!ENTITY exchWebService.actualWork.label "Actual work:"> +<!ENTITY exchWebService.mileage.label "Mileage:"> +<!ENTITY exchWebService.billingInformation.label "Billing information:"> +<!ENTITY exchWebService.companies.label "Company:"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/calendar-event-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 @@ -1,6 +0,0 @@ -<!ENTITY exchWebService.owner.label "Eigenaar:"> -<!ENTITY exchWebService.totalWork.label "Werk totaal:"> -<!ENTITY exchWebService.actualWork.label "Werk echt:"> -<!ENTITY exchWebService.mileage.label "Rendement:"> -<!ENTITY exchWebService.billingInformation.label "Factuurinfo:"> -<!ENTITY exchWebService.companies.label "Bedrijf:"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/lightning-item-iframe.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,6 @@ +<!ENTITY exchWebService.owner.label "Eigenaar:"> +<!ENTITY exchWebService.totalWork.label "Werk totaal:"> +<!ENTITY exchWebService.actualWork.label "Werk echt:"> +<!ENTITY exchWebService.mileage.label "Rendement:"> +<!ENTITY exchWebService.billingInformation.label "Factuurinfo:"> +<!ENTITY exchWebService.companies.label "Bedrijf:"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/calendar-event-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 @@ -1,7 +0,0 @@ -<!ENTITY exchWebService.owner.label "Владелец:"> -<!ENTITY exchWebService.totalWork.label "Всего работ:"> -<!ENTITY exchWebService.actualWork.label "Фактическая работа:"> -<!ENTITY exchWebService.mileage.label "Пробег:"> -<!ENTITY exchWebService.billingInformation.label "Платежная информация:"> -<!ENTITY exchWebService.companies.label "Компания:"> - diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/lightning-item-iframe.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,7 @@ +<!ENTITY exchWebService.owner.label "Владелец:"> +<!ENTITY exchWebService.totalWork.label "Всего работ:"> +<!ENTITY exchWebService.actualWork.label "Фактическая работа:"> +<!ENTITY exchWebService.mileage.label "Пробег:"> +<!ENTITY exchWebService.billingInformation.label "Платежная информация:"> +<!ENTITY exchWebService.companies.label "Компания:"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/calendar-event-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 @@ -1,7 +0,0 @@ -<!ENTITY exchWebService.owner.label "Ägare:"> -<!ENTITY exchWebService.totalWork.label "Total arbetstid:"> -<!ENTITY exchWebService.actualWork.label "Faktisk arbetstid:"> -<!ENTITY exchWebService.mileage.label "Körsträcka:"> -<!ENTITY exchWebService.billingInformation.label "Faktureringsinformation:"> -<!ENTITY exchWebService.companies.label "Företag:"> - diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/lightning-item-iframe.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,7 @@ +<!ENTITY exchWebService.owner.label "Ägare:"> +<!ENTITY exchWebService.totalWork.label "Total arbetstid:"> +<!ENTITY exchWebService.actualWork.label "Faktisk arbetstid:"> +<!ENTITY exchWebService.mileage.label "Körsträcka:"> +<!ENTITY exchWebService.billingInformation.label "Faktureringsinformation:"> +<!ENTITY exchWebService.companies.label "Företag:"> + diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/calendar-event-dialog.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/calendar-event-dialog.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/calendar-event-dialog.dtd 1970-01-01 01:00:00.000000000 +0100 @@ -1,6 +0,0 @@ -<!ENTITY exchWebService.owner.label “Sahip:”> -<!ENTITY exchWebService.totalWork.label "Toplam iş:”> -<!ENTITY exchWebService.actualWork.label “Gerçekleşen iş:”> -<!ENTITY exchWebService.mileage.label "Mil olarka uzaklık:”> -<!ENTITY exchWebService.billingInformation.label “Faturalama bilgileri:”> -<!ENTITY exchWebService.companies.label “Şirket:”> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/delegate-folder.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/delegate-folder.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/delegate-folder.dtd 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/delegate-folder.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -1,45 +1,45 @@ -<!ENTITY label.delegatefolder.cancelbutton "Cancel"> -<!ENTITY label.delegatefolder.userEmail "Email"> +<!ENTITY label.delegatefolder.cancelbutton "İptal Et"> +<!ENTITY label.delegatefolder.userEmail "E-posta"> -<!ENTITY label.delegatefolder.permissionLevel "Permission Level"> -<!ENTITY label.delegatefolder.userboxcolumn1 "User"> -<!ENTITY label.delegatefolder.userboxcolumn2 "Permissions"> +<!ENTITY label.delegatefolder.permissionLevel "İzin Seviyesi"> +<!ENTITY label.delegatefolder.userboxcolumn1 "Kullanıcı"> +<!ENTITY label.delegatefolder.userboxcolumn2 "İzinler"> -<!ENTITY menuitem.delegatefolder.permission.author "Author"> -<!ENTITY menuitem.delegatefolder.permission.editor "Editor"> -<!ENTITY menuitem.delegatefolder.permission.reviewer "Reviewer"> -<!ENTITY menuitem.delegatefolder.permission.none "None"> -<!ENTITY menuitem.delegatefolder.permission.owner "Owner" > -<!ENTITY menuitem.delegatefolder.permission.publishingEditor "PublishingEditor" > -<!ENTITY menuitem.delegatefolder.permission.publishingAuthor "PublishingAuthor" > -<!ENTITY menuitem.delegatefolder.permission.noneditingAuthor "NoneditingAuthor" > -<!ENTITY menuitem.delegatefolder.permission.contributor "Contributor" > -<!ENTITY menuitem.delegatefolder.permission.custom "Custom" > +<!ENTITY menuitem.delegatefolder.permission.author "Yazıcı"> +<!ENTITY menuitem.delegatefolder.permission.editor "Düzenleyici"> +<!ENTITY menuitem.delegatefolder.permission.reviewer "Okuyucu"> +<!ENTITY menuitem.delegatefolder.permission.none "Yok"> +<!ENTITY menuitem.delegatefolder.permission.owner "Sahip" > +<!ENTITY menuitem.delegatefolder.permission.publishingEditor "YayınlayanDüzenleyici" > +<!ENTITY menuitem.delegatefolder.permission.publishingAuthor "YayınlayanYazıcı" > +<!ENTITY menuitem.delegatefolder.permission.noneditingAuthor "DüzenleyemeyenYazıcı" > +<!ENTITY menuitem.delegatefolder.permission.contributor "Yardımcı" > +<!ENTITY menuitem.delegatefolder.permission.custom "Özel" > -<!ENTITY delegatefolder.permission.description.author "Read and create items in the folder." > -<!ENTITY delegatefolder.permission.description.editor "Read, create, and modify items in the folder." > -<!ENTITY delegatefolder.permission.description.reviewer "Read items in the folder." > -<!ENTITY delegatefolder.permission.description.none "No access permissions to the folder." > +<!ENTITY delegatefolder.permission.description.author "Dizindeki maddeleri okuyabilir ve yaratabilir." > +<!ENTITY delegatefolder.permission.description.editor "Dizindeki maddeleri okuyabilir, yaratabilir ve değiştirebilir." > +<!ENTITY delegatefolder.permission.description.reviewer "Dizindeki maddeleri okuyabilir." > +<!ENTITY delegatefolder.permission.description.none "Bu dizine erişim izni yok." > - <!ENTITY delegatefolder.permission.details.caption "Permission "> + <!ENTITY delegatefolder.permission.details.caption "İzin "> -<!ENTITY delegatefolder.tab.msg.label "No Calendar or Task found for this mail account."> -<!ENTITY delegatefolder.tab.name "Exchange Folder Sharing"> +<!ENTITY delegatefolder.tab.msg.label "Bu posta hesabı için bir Takvim ya da Görev Listesi bulunamadı."> +<!ENTITY delegatefolder.tab.name "Exchange Dizin Paylaşımı"> -<!ENTITY delegatefolder.permissions.none "None"> -<!ENTITY delegatefolder.permissions.own "Own items"> -<!ENTITY delegatefolder.permissions.all "All items"> -<!ENTITY delegatefolder.permissions.full "Full details"> +<!ENTITY delegatefolder.permissions.none "Yok"> +<!ENTITY delegatefolder.permissions.own "Kendi maddeleri"> +<!ENTITY delegatefolder.permissions.all "Bütün maddeler"> +<!ENTITY delegatefolder.permissions.full "Tüm detaylar"> -<!ENTITY delegatefolder.permissions.cancreateitems "Create Items"> -<!ENTITY delegatefolder.permissions.cancreatesubfolders "Create SubFolders"> -<!ENTITY delegatefolder.permissions.isfolderowner "Folder Owner"> -<!ENTITY delegatefolder.permissions.isfoldervisible "Folder Visible"> -<!ENTITY delegatefolder.permissions.isfoldercontact "Folder Contact"> -<!ENTITY delegatefolder.permissions.edititems "Edit Items"> -<!ENTITY delegatefolder.permissions.deleteitems "Delete Items"> -<!ENTITY delegatefolder.permissions.readitems "Read Items"> +<!ENTITY delegatefolder.permissions.cancreateitems "Madde Yarat"> +<!ENTITY delegatefolder.permissions.cancreatesubfolders "Altdizinler Yarat"> +<!ENTITY delegatefolder.permissions.isfolderowner "Dizin Sahibi"> +<!ENTITY delegatefolder.permissions.isfoldervisible "Dizin Görülebiliyor"> +<!ENTITY delegatefolder.permissions.isfoldercontact "Dizinle İlişkili Kişi"> +<!ENTITY delegatefolder.permissions.edititems "Maddeleri Düzenleyebilir"> +<!ENTITY delegatefolder.permissions.deleteitems "Maddeleri Silebilir"> +<!ENTITY delegatefolder.permissions.readitems "Maddeleri Okuyabilir"> -<!ENTITY delegatefolder.permissions.true "True"> -<!ENTITY delegatefolder.permissions.false "False"> +<!ENTITY delegatefolder.permissions.true "Doğru"> +<!ENTITY delegatefolder.permissions.false "Yanlış"> diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/lightning-item-iframe.dtd --- calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/lightning-item-iframe.dtd 1970-01-01 01:00:00.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/lightning-item-iframe.dtd 2017-07-03 22:10:10.000000000 +0200 @@ -0,0 +1,6 @@ +<!ENTITY exchWebService.owner.label “Sahip:”> +<!ENTITY exchWebService.totalWork.label "Toplam iş:”> +<!ENTITY exchWebService.actualWork.label “Gerçekleşen iş:”> +<!ENTITY exchWebService.mileage.label "Mil olarka uzaklık:”> +<!ENTITY exchWebService.billingInformation.label “Faturalama bilgileri:”> +<!ENTITY exchWebService.companies.label “Şirket:”> diff -Nru calendar-exchange-provider-3.9.0/README.md calendar-exchange-provider-4.0.0~beta4/README.md --- calendar-exchange-provider-3.9.0/README.md 2017-01-12 07:45:54.000000000 +0100 +++ calendar-exchange-provider-4.0.0~beta4/README.md 2017-07-03 22:10:10.000000000 +0200 @@ -1,50 +1,7 @@ -##Exchange EWS Provider -===================== -Thank you for checking out Ericsson's Exchange EWS Provider. Ericsson and the Ericsson QA team are grateful for the help and hard work of many [contributors][contributors] like yourself. +Exchange Calendar is an **add-on for Thunderbird and Lightning** that provides **Exchange calendar support**. -Current Release Vs. Download trend is something like [this](https://rawgit.com/muthusuba/github-tools/master/downloads-trend.html?user=Ericsson&repo=exchangecalendar) - - -Getting involved as a contributor ------------------------------------------- -We love working with contributors for Exchange EWS Provider, but it does require a few skills. You will need to know some Javascript, XUL, some CSS and a basic familiarity with GitHub. - -If you know some Javascript, it's worth having a look at the Object Oriented Programming to understand the basic concepts of class based coding and especially for xul window objects. - -If you need to brush-up on programming, but are eager to start contributing immediately, please consider helping us find bugs in Github [Exchange EWS Provider][Exchange EWS Provider] or find bugs in the Issues tested by the [EricssonQA][EricssonQA] team. To brush up on Javascript skills before engaging with us, Dive Into Javascript [mozilla][mozilla] is an excellent resource. W3schools also has [notes on Javascript][w3schools] available through their website. The programming concepts you will need to know include functions, working with classes, and some object-oriented programming basics. To brush up on XUL, Mozilla [XUL][XUL] is an easy and simple place to learn XUL, More of XUL are dynamically configured and cross-plateform. - -Special thanks to all our [contributors][contributors] - -[w3schools]: http://www.w3schools.com/js/ -[mozilla]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide -[EricssonQA]: https://github.com/Ericsson/exchangecalendar/ -[Exchange EWS Provider]: https://github.com/Ericsson/exchangecalendar/issues -[XUL]: https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School -[contributors]: https://github.com/Ericsson/exchangecalendar/contributors - -Questions are always welcome ----------------------------- -While we take pains to keep our documentation updated, the best source of information is those of us who work on the project. We also have the [wiki][wiki] pages to answer your general questions about contributing to Exchange EWS Provider. - -[wiki]: https://github.com/Ericsson/exchangecalendar/wiki - -Getting set up -------------- -It's easy to get set up: just 2 pieces of software to install and in few command lines you'll be running the addon! - -### Install Thunderbird -If you don't already have it installed, please install latest version -https://support.mozilla.org/en-US/kb/installing-thunderbird - -### Install Lightning -If you don't already have it installed, please install latest version -https://support.mozilla.org/en-US/kb/installing-lightning-thunderbird - -### Cloning the test repository with Git -After you have installed [Git] you will need to clone the project to your hard drive. From your workspace directory run this command which will copy (clone) the project to your hard drive - - git clone --recursive git://github.com/Ericsson/exchangecalendar.git -[Git]: http://en.wikipedia.org/wiki/Git_%28software%29 +## Contributing +This add-on is open-source and based on the work of many [contributors](https://github.com/ExchangeCalendar/exchangecalendar/graphs/contributors). ### Installing developement tools You will need to install Dom Inspector, Javascript Debugger and some other development tools. Fortunately `Thunderbird addons` makes it easy to install all of these: @@ -53,21 +10,6 @@ cd ./exchangecalendar_master; chmod +x ./build.sh; ./build.sh; -Now you can install the Exchange EWS Provider addon - -Writing Code -------------- -If you want to get involved and add more code, then there's just a few things -we'd like to ask you to do: - -1. Use the similar code format for all new developement and window objects -2. Follow mozilla's simple [Coding Style Guide][Coding Style Guide] recommendations -3. Fork this project with your own GitHub account -4. Make sure all tests are passing and submit a pull request with your changes - -[Coding Style Guide]: https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style - -License -------- +## License This software is licensed under the [GNU GPL] Version 3 [GNU GPL]: http://www.gnu.org/licenses/gpl.html
Attachment:
signature.asc
Description: OpenPGP digital signature