This is just some static backup of the original site, don't expect every link to work!

source: chrome/content/v_identity/vI_getHeader.js @ 9cedc0

ng_0.9
Last change on this file since 9cedc0 was 9cedc0, checked in by rene <rene@…>, 11 years ago

compatibility for conversation plugin

  • Property mode set to 100644
File size: 16.1 KB
Line 
1/* ***** BEGIN LICENSE BLOCK *****
2    This program is free software; you can redistribute it and/or modify
3    it under the terms of the GNU General Public License as published by
4    the Free Software Foundation; either version 2 of the License, or
5    (at your option) any later version.
6
7    This program is distributed in the hope that it will be useful,
8    but WITHOUT ANY WARRANTY; without even the implied warranty of
9    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10    GNU General Public License for more details.
11
12    You should have received a copy of the GNU General Public License
13    along with this program; if not, write to the Free Software
14    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
15
16    The Original Code is the Virtual Identity Extension.
17
18    The Initial Developer of the Original Code is Rene Ejury.
19    Portions created by the Initial Developer are Copyright (C) 2007
20    the Initial Developer. All Rights Reserved.
21
22    Contributor(s): Christian Weiske
23    Contributor(s): Patrick Brunschwig
24    Contributor(s): http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
25
26 * ***** END LICENSE BLOCK ***** */
27
28/**
29* some code copied and adapted from 'display Mail User Agent (MUA)'
30* thanks to Christian Weiske <cweiske@cweiske.de>
31*/
32/**
33* some code copied and adapted from 'enigmail'
34* thanks to Patrick Brunschwig <patrick.brunschwig@gmx.net>
35*/
36/**
37* some code copied and adapted from 'http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html'
38* thanks to the unknown programmer
39*/
40
41virtualIdentityExtension.ns(function() { with (virtualIdentityExtension.LIB) {
42// var storedHeaders = { };
43var getHeader = {
44    messenger: null,
45    preferences : Components.classes["@mozilla.org/preferences-service;1"]
46            .getService(Components.interfaces.nsIPrefService)
47            .getBranch("extensions.virtualIdentity."),
48           
49    unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
50            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
51
52    strings : document.getElementById("vIdentBundle"),
53   
54    headerToSearch : null,
55   
56    prepareHeaderToSearchArray : function() {
57        var headerList = getHeader.unicodeConverter.ConvertToUnicode(getHeader.preferences.getCharPref("smart_reply_headers")).split(/\n/)
58       
59        getHeader.headerToSearch = [];
60       
61        // prepare headerToSearch for speedup.
62        for (var index = 0; index < headerList.length; index++) {
63            var headerToSearch_splitted = headerList[index].split(/:/)
64            // use first part (all before ':') as the header name
65            var headerNameToSearch = headerToSearch_splitted[0].toLowerCase()
66            // check second or third part for any number
67            var headerNumberToSearch = parseInt(headerToSearch_splitted[1])
68            if (isNaN(headerNumberToSearch)) headerNumberToSearch = parseInt(headerToSearch_splitted[2])
69           
70            // create header name to store the value
71            var headerNameToStore = "vI_" + headerNameToSearch
72            if (!isNaN(headerNumberToSearch)) headerNameToStore += ":" + headerNumberToSearch
73           
74            getHeader.headerToSearch.push({ headerNameToSearch : headerNameToSearch, headerNumberToSearch : headerNumberToSearch,
75                    headerNameToStore : headerNameToStore });
76        }
77    },
78
79    getHeaderDummy: function() {
80       
81    },
82   
83    getHeader: function(hdr) {
84        vI.notificationBar.clear_dump()
85        var index;
86
87        if (!getHeader.headerToSearch) getHeader.prepareHeaderToSearchArray()
88
89        var found = false; var label = "";
90        var subtitle = getHeader.strings.getString("vident.getHeader.noHeader");
91        // create array to count the header
92        var currentHeadersCounter = [];
93//      storedHeaders = { };
94       
95        var listId = false; var received = false; var content_base = false;
96        for (var header in currentHeaderData) {
97            var headerName = currentHeaderData[header].headerName.toLowerCase();
98//          vI.notificationBar.dump("## getHeader: found header: " + currentHeaderData[header].headerName + "\n");
99
100            // remember list-id header to prevent using Mailing-List addresses as sender
101            if (!listId && headerName == "list-id") {
102                hdr.setStringProperty("vI_list-id","found"); listId = true;
103//              storedHeaders["vI_list-id"] = "found";
104                vI.notificationBar.dump("## getHeader: found header: list-id  ...stored to recognize mailing-list\n");
105//              continue;
106            }
107
108            // remember received header to prevent using Mailing-List addresses as sender
109            if (!received && headerName == "received") {
110                hdr.setStringProperty("vI_received","found"); received = true;
111//              storedHeaders["vI_received"] = "found";
112                vI.notificationBar.dump("## getHeader: found header: received  ...stored to recognize received mail\n");
113//              continue;
114            }
115           
116            // remember content-base header to prevent using Blog/News-Feed addresses as sender
117            if (!content_base && headerName == "content-base") {
118                hdr.setStringProperty("vI_content_base","found"); content_base = true;
119//              storedHeaders["vI_content_base"] = "found";
120                vI.notificationBar.dump("## getHeader: found header: content-base  ...stored to recognize blog/news-feed\n");
121//              continue;
122            }
123
124            if (currentHeadersCounter[headerName]) currentHeadersCounter[headerName]++
125            else currentHeadersCounter[headerName] = 1
126           
127            for (var index = 0; index < getHeader.headerToSearch.length; index++) {
128                if (headerName == getHeader.headerToSearch[index].headerNameToSearch &&
129                    (isNaN(getHeader.headerToSearch[index].headerNumberToSearch) ||
130                        getHeader.headerToSearch[index].headerNumberToSearch == currentHeadersCounter[headerName])) {
131                   
132                    var value = currentHeaderData[header].headerValue;
133                    if (currentHeadersCounter[headerName] != 1)
134                        value = hdr.getStringProperty(getHeader.headerToSearch[index].headerNameToStore) + 
135                        ", " + value;
136                    hdr.setStringProperty(getHeader.headerToSearch[index].headerNameToStore,getHeader.unicodeConverter.ConvertFromUnicode(value) + getHeader.unicodeConverter.Finish());
137                   
138//                  storedHeaders[getHeader.headerToSearch[index].headerNameToStore] = getHeader.unicodeConverter.ConvertFromUnicode(value) + getHeader.unicodeConverter.Finish();
139
140                    var storedValue = hdr.getProperty(getHeader.headerToSearch[index].headerNameToStore)
141                    var storedConvValue = getHeader.unicodeConverter.ConvertToUnicode(storedValue)
142                    vI.notificationBar.dump("## getHeader: found header: " + headerName +
143                        "[:" + currentHeadersCounter[headerName] + "] - stored as '" + 
144                        storedConvValue + "'\n");
145/*                  vI.notificationBar.dump("## getHeader: additional stored header: " + getHeader.headerToSearch[index].headerNameToStore +
146                        " '" + storedHeaders[getHeader.headerToSearch[index].headerNameToStore] + "'\n");*/
147                    if (!found) { 
148                        subtitle = getHeader.strings.getString("vident.getHeader.headerFound");
149                        found = true;
150                    }
151                    label += (label)?"\n":""
152                    label += currentHeaderData[header].headerName + 
153                    "[:" + currentHeadersCounter[headerName] + "]:\t" + currentHeaderData[header].headerValue
154                    break;
155                }
156            }
157        }
158        vI.notificationBar.setNote(label, "get_header_notification", subtitle);
159    },
160   
161    hideExtraHeader: function() {
162        var addedHdrs = prepareHeader.prefroot.getCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders").split(/ /);
163        for (var index = 0; index < addedHdrs.length; index++) {
164            var header_to_search_splitted=addedHdrs[index].split(/:/)
165            var header_to_search=header_to_search_splitted[0].toLowerCase()
166            if (typeof(gExpandedHeaderView[header_to_search]) == "object") {
167                if (! gViewAllHeaders) {
168                    gExpandedHeaderView[header_to_search].enclosingBox.setAttribute("hidden", true);
169                }
170                else {
171                    gExpandedHeaderView[header_to_search].enclosingBox.removeAttribute("hidden");
172                }
173            }
174        }
175    },
176
177    setupEventListener: function() {
178        var listener = {};
179        listener.onStartHeaders = getHeader.hideExtraHeader;
180        listener.onEndHeaders   = getHeader.getHeaderDummy;
181        gMessageListeners.push(listener);
182
183        getHeader.messenger = Components.classes["@mozilla.org/messenger;1"].createInstance();
184        getHeader.messenger = getHeader.messenger.QueryInterface(Components.interfaces.nsIMessenger);
185        getHeader.strings = document.getElementById("vIdentBundle");
186       
187        getHeader.unicodeConverter.charset = "UTF-8";
188       
189        // read headers later if msg is loaded completely - this ensures compatibility to Thunderbird Conversation
190        getHeader.orig_OnMsgLoaded = OnMsgLoaded;
191        OnMsgLoaded = getHeader.OnMsgLoaded;
192    },
193   
194    OnMsgLoaded: function(url) {
195        const Cc = Components.classes;
196        const Ci = Components.interfaces;
197        // Necko URL, so convert it into a message header
198        let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
199        var neckoURL = ioService.newURI(null, null, url.baseURI);
200        neckoURL.QueryInterface(Ci.nsIMsgMessageUrl);
201       
202        var msgHdr = neckoURL.messageHeader;
203        if (msgHdr) getHeader.getHeader(msgHdr);
204        getHeader.orig_OnMsgLoaded(url)
205    }
206}
207
208
209var prepareHeader = {
210    prefroot : Components.classes["@mozilla.org/preferences-service;1"]
211            .getService(Components.interfaces.nsIPrefService)
212            .getBranch(null),
213
214    unicodeConverter : Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
215            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter),
216           
217    observer_added : false,
218   
219    init : function() {
220        prepareHeader.orig_initializeHeaderViewTables = initializeHeaderViewTables;
221        initializeHeaderViewTables = prepareHeader.replacement_initializeHeaderViewTables;
222        if (prepareHeader.addExtraHeader()) prepareHeader.addObserver();
223    },
224   
225    replacement_initializeHeaderViewTables : function() {
226        prepareHeader.cleanup();
227        vI.notificationBar.dump("## getHeader: initializeHeaderViewTables\n");
228        prepareHeader.orig_initializeHeaderViewTables();
229        if (prepareHeader.addExtraHeader()) prepareHeader.addObserver();
230    },
231   
232    cleanup : function() {
233        prepareHeader.removeObserver();
234        prepareHeader.removeExtraHeader();
235    },
236   
237    addObserver : function() {
238        if (prepareHeader.observer_added) return;
239        prepareHeader.prefroot.QueryInterface(Components.interfaces.nsIPrefBranch2);
240        prepareHeader.prefroot.addObserver("extensions.virtualIdentity.smart_reply_headers", this, false);
241        prepareHeader.uninstallObserver.register();
242        prepareHeader.observer_added = true;
243    },
244   
245    removeObserver : function() {
246        if (!prepareHeader.observer_added) return;
247        prepareHeader.prefroot.removeObserver("extensions.virtualIdentity.smart_reply_headers", this);
248        prepareHeader.uninstallObserver.unregister();
249        prepareHeader.observer_added = false;
250    },
251   
252    // this is a adapted copy of enigEnsureExtraHeaders() from enigmail, thanks
253    addExtraHeader : function() {
254        prepareHeader.unicodeConverter.charset = "UTF-8";
255        var header_list = prepareHeader.unicodeConverter.ConvertToUnicode(prepareHeader.prefroot.getCharPref("extensions.virtualIdentity.smart_reply_headers")).split(/\n/)
256       
257        // add List-Id to recognizable headers to prevent using Mailing-List addresses as sender
258        header_list.push("List-Id")
259
260        // add Received to recognizable headers to detect if mail was sent or received
261        header_list.push("Received")
262
263        // add Website to recognizable headers to detect Blog/News-Posts
264        header_list.push("content-base")
265
266//      try {
267            var extraHdrs = " " + 
268                prepareHeader.prefroot.getCharPref("mailnews.headers.extraExpandedHeaders").toLowerCase();
269
270            var addedHeaders = prepareHeader.prefroot.getCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders");
271
272            for (var index = 0; index < header_list.length; index++) {
273                var headerToSearch_splitted = header_list[index].split(/:/)
274                var headerToSearch = headerToSearch_splitted[0].toLowerCase()
275               
276                var j; var found = false;
277               
278                // collapsedHeaderView is removed in
279                // https://bugzilla.mozilla.org/show_bug.cgi?id=480623
280                // http://build.mozillamessaging.com/mercurial/comm-central/rev/1fbbd90413d9
281                if (typeof(gCollapsedHeaderList) != "undefined") {
282                    // check if Header is included in collapsed HeaderView
283                    for (var j = 0; j < gCollapsedHeaderList.length; j++) {
284                        if (gCollapsedHeaderList[j].name == headerToSearch) {
285    //                      vI.notificationBar.dump("## prepareHeader: Header '" + headerToSearch + "' in gCollapsedHeaderList\n");
286                            found = true; break;
287                        }
288                    }
289                    if (found) continue;
290                }
291
292                // check if Header is included in expanded HeaderView
293                for (var j = 0; j < gExpandedHeaderList.length; j++) {
294                    if (gExpandedHeaderList[j].name == headerToSearch) {
295//                      vI.notificationBar.dump("## prepareHeader: Header '" + headerToSearch + "' in gExpandedHeaderList\n");
296                        found = true; break;
297                    }
298                }
299                if (found) continue;
300
301                if ((extraHdrs.indexOf(" " + headerToSearch + " ") < 0) &&
302                    (addedHeaders.indexOf(" " + headerToSearch + " ") < 0))
303                        addedHeaders += " " + headerToSearch;
304//              else vI.notificationBar.dump("## prepareHeader: Header '" + headerToSearch + "' already in extraExpandedHeaders\n");
305            }
306           
307            addedHeaders = addedHeaders.replace(/^\s+|\s+$/g,"")
308            if (addedHeaders.length > 0) {
309                extraHdrs += " " + addedHeaders;
310                extraHdrs = extraHdrs.replace(/^\s+|\s+$/g,"")
311                prepareHeader.prefroot.setCharPref("mailnews.headers.extraExpandedHeaders", extraHdrs)
312                prepareHeader.prefroot.setCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders", addedHeaders)
313                vI.notificationBar.dump("## prepareHeader: extraExpandedHeaders '" + addedHeaders + "' added\n");
314            }       
315
316            return true;
317//      }
318//      catch (e) {
319//          vI.notificationBar.dump("## prepareHeader: your application is too old, please update. Otherwise try to install mnenhy or enigmail to use additional headers.")
320//          return false;
321//      }
322    },
323
324    removeExtraHeader: function() {
325        vI.notificationBar.dump("## prepareHeader: cleanupExtraHeader\n");
326
327        var addedHdrs = prepareHeader.prefroot.getCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders").split(/ /);
328
329        if (addedHdrs.length > 0) {
330            var extraHdrs = prepareHeader.prefroot.getCharPref("mailnews.headers.extraExpandedHeaders").toLowerCase().split(/ /);
331       
332            for (var i = 0; i < addedHdrs.length; i++) {
333                for (var j = 0; j < extraHdrs.length; j++) {
334                    if (extraHdrs[j] == addedHdrs[i]) {
335                        extraHdrs.splice(j,1);
336                        break;
337                    }
338                }
339            }
340            vI.notificationBar.dump("## prepareHeader: extraExpandedHeaders '" + addedHdrs.join(" ") + "' removed\n");
341            prepareHeader.prefroot.setCharPref("mailnews.headers.extraExpandedHeaders", extraHdrs.join(" "))
342            prepareHeader.prefroot.setCharPref("extensions.virtualIdentity.smart_reply_added_extraHeaders", "")
343        }
344    },
345   
346    observe: function(subject, topic, data) {
347        if (topic == "nsPref:changed") {
348            prepareHeader.removeExtraHeader();
349            prepareHeader.addExtraHeader();
350            vI.notificationBar.dump("## prepareHeader: changed preference '" + subject + " " + topic + " " + data + "'\n");
351           
352            // remove (old) prepared headerArray
353            getHeader.headerToSearch = null;
354           
355            vI.notificationBar.dump("## prepareHeader: reload Message\n");
356            MsgReload();
357        }
358    },
359
360//  code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html
361    uninstallObserver : {
362        _uninstall : false,
363        observe : function(subject, topic, data) {
364            if (topic == "quit-application-granted") {
365                /* uninstall stuff. */
366                vI.notificationBar.dump("## vI.uninstall: uninstall/disabledment \n");
367                prepareHeader.removeExtraHeader();
368                vI.notificationBar.dump("## vI.uninstall: uninstall/disablement done\n");
369                this.unregister();
370            }
371        },
372        register : function() {
373            Components.classes["@mozilla.org/observer-service;1"].
374                getService(Components.interfaces.nsIObserverService).
375                    addObserver(this, "quit-application-granted", false);
376        },
377        unregister : function() {
378            Components.classes["@mozilla.org/observer-service;1"].
379                getService(Components.interfaces.nsIObserverService).
380                    removeObserver(this,"quit-application-granted");
381        }
382    }
383}
384addEventListener('messagepane-loaded', getHeader.setupEventListener, true);
385window.addEventListener("load", function(e) { prepareHeader.init(); }, false);
386window.addEventListener("unload", function(e) { prepareHeader.cleanup(); }, false);
387// vI.storedHeaders = storedHeaders;
388}});
Note: See TracBrowser for help on using the repository browser.