Changeset 509348 for modules/vI_rdfDatasource.js
- Timestamp:
- Nov 3, 2014, 12:35:40 PM (8 years ago)
- Branches:
- ng_0.9
- Children:
- 7204cb
- Parents:
- 3c9c29
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
modules/vI_rdfDatasource.js
r3c9c29 r509348 43 43 44 44 function rdfDatasource(rdfFileName, dontRegisterObserver) { 45 this._rdfFileName = rdfFileName; 46 if (this._rdfFileName) this.init(); 47 if (!dontRegisterObserver) this.AccountManagerObserver.register(); 45 this._rdfFileName = rdfFileName; 46 if (this._rdfFileName) this.init(); 47 if (!dontRegisterObserver) this.AccountManagerObserver.register(); 48 try { 49 this._extVersion = get3PaneWindow().virtualIdentityExtension.extensionVersion; 50 } catch (e) {} 51 } 52 53 function initWithFilePath_tryDelimiters(_nsILocalFile, path, filename) { 54 try { 55 Log.debug("Filename try linux delimiter: '" + path + "/" + filename + "'"); 56 _nsILocalFile.initWithPath(path + "/" + filename); 57 } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) { 48 58 try { 49 this._extVersion = get3PaneWindow().virtualIdentityExtension.extensionVersion; 50 } catch (e) { } 59 Log.debug("Filename try windows delimiter: '" + path + "\\" + filename + "'"); 60 _nsILocalFile.initWithPath(path + "\\" + filename); 61 } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) { 62 Log.debug("Filename not valid: '" + path + "[\\/]" + filename + "'"); 63 Log.debug("can't open rdfDatasource - storage won't work"); 64 var debugMsg = "Filename not valid: '" + path + "\\" + filename + "'\n" + 65 "Filename not valid: '" + path + "/" + filename + "'\n" + 66 "Virtual Identity Storage won't work.\n\n" + 67 "Please report this issue with filename on https://www.absorb.it/virtual-id\n\n" + 68 "You can just copy the lines below in your browser to create a ticket\n\n" + 69 "https://www.absorb.it/virtual-id/newticket?summary=RDF Filename Error&description=Filename " + path + "[\\/]" + filename + " for rdf not valid" 70 get3PaneWindow().alert(debugMsg); 71 return; 72 } 73 } 74 }; 75 76 rdfDatasource.prototype = { 77 _extVersion: null, 78 _rdfVersion: "0.0.5", 79 _rdfService: Components.classes["@mozilla.org/rdf/rdf-service;1"] 80 .getService(Components.interfaces.nsIRDFService), 81 _rdfDataSource: null, 82 _rdfFileName: null, 83 _rdfNS: "http://virtual-id.absorb.it/", 84 _rdfNSStorage: "vIStorage", 85 _rdfNSEmail: "vIStorage/email", 86 _rdfNSMaillist: "vIStorage/maillist", 87 _rdfNSNewsgroup: "vIStorage/newsgroup", 88 _rdfNSFilter: "vIStorage/filter", 89 _rdfNSAccounts: "vIAccounts", 90 _rdfNSIdentities: "vIAccounts/id", 91 _rdfNSSMTPservers: "vIAccounts/smtp", 92 93 _virtualIdentityID: "{dddd428e-5ac8-4a81-9f78-276c734f75b8}", 94 95 _emailContainer: Components.classes["@mozilla.org/rdf/container;1"] 96 .createInstance(Components.interfaces.nsIRDFContainer), 97 98 _maillistContainer: Components.classes["@mozilla.org/rdf/container;1"] 99 .createInstance(Components.interfaces.nsIRDFContainer), 100 101 _newsgroupContainer: Components.classes["@mozilla.org/rdf/container;1"] 102 .createInstance(Components.interfaces.nsIRDFContainer), 103 104 _filterContainer: Components.classes["@mozilla.org/rdf/container;1"] 105 .createInstance(Components.interfaces.nsIRDFContainer), 106 107 _identityContainer: Components.classes["@mozilla.org/rdf/container;1"] 108 .createInstance(Components.interfaces.nsIRDFContainer), 109 110 _smtpContainer: Components.classes["@mozilla.org/rdf/container;1"] 111 .createInstance(Components.interfaces.nsIRDFContainer), 112 113 getContainer: function (type) { 114 switch (type) { 115 case "email": 116 return this._emailContainer; 117 case "maillist": 118 return this._maillistContainer; 119 case "newsgroup": 120 return this._newsgroupContainer; 121 case "filter": 122 return this._filterContainer; 123 case "identity": 124 return this._identityContainer; 125 case "smtp": 126 return this._smtpContainer; 127 } 128 return null; 129 }, 130 131 init: function () { 132 // Log.debug("init."); 133 134 this._openRdfDataSource(); 135 if (!this._rdfDataSource) return; 136 this._initContainers(); 137 if (this.rdfUpgradeRequired()) this.rdfUpgrade(); 138 139 // store version everytime to recognize downgrades later 140 this.storeRDFVersion(); 141 142 // this.refreshAccountInfo(); 143 // Log.debug("init done."); 144 }, 145 146 _openRdfDataSource: function () { 147 // if (!this._rdfFileName || this._rdfDataSource); 148 var protoHandler = Components.classes["@mozilla.org/network/protocol;1?name=file"] 149 .getService(Components.interfaces.nsIFileProtocolHandler) 150 var newFile = Components.classes["@mozilla.org/file/local;1"] 151 .createInstance(Components.interfaces.nsILocalFile); 152 153 var file = Components.classes["@mozilla.org/file/directory_service;1"] 154 .getService(Components.interfaces.nsIProperties) 155 .get("ProfD", Components.interfaces.nsIFile); 156 157 // Log.debug("_openRdfDataSource"); 158 initWithFilePath_tryDelimiters(newFile, file.path, this._rdfFileName); 159 160 var fileURI = protoHandler.newFileURI(newFile); 161 162 Log.debug("init: read rdf from '" + fileURI.spec + "'"); 163 164 this._rdfDataSource = 165 this._rdfService.GetDataSourceBlocking(fileURI.spec); 166 167 // Log.debug("read rdf from '" + fileURI.spec + "' done." + this._rdfService); 168 }, 169 170 _initContainers: function () { 171 try { // will possibly fail before upgrade 172 var storageRes = this._rdfService 173 .GetResource(this._rdfNS + this._rdfNSEmail); 174 this._emailContainer.Init(this._rdfDataSource, storageRes); 175 storageRes = this._rdfService 176 .GetResource(this._rdfNS + this._rdfNSMaillist); 177 this._maillistContainer.Init(this._rdfDataSource, storageRes); 178 storageRes = this._rdfService 179 .GetResource(this._rdfNS + this._rdfNSNewsgroup); 180 this._newsgroupContainer.Init(this._rdfDataSource, storageRes); 181 storageRes = this._rdfService 182 .GetResource(this._rdfNS + this._rdfNSFilter); 183 this._filterContainer.Init(this._rdfDataSource, storageRes); 184 storageRes = this._rdfService 185 .GetResource(this._rdfNS + this._rdfNSIdentities); 186 this._identityContainer.Init(this._rdfDataSource, storageRes); 187 storageRes = this._rdfService 188 .GetResource(this._rdfNS + this._rdfNSSMTPservers); 189 this._smtpContainer.Init(this._rdfDataSource, storageRes); 190 } catch (e) {}; 191 }, 192 193 // ****************************************************************************************** 194 // ************** BEGIN RDF UPGRADE CODE ********************************************** 195 rdfUpgradeRequired: function () { 196 var oldRdfVersion = this.getCurrentRDFFileVersion(); 197 var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"] 198 .getService(Components.interfaces.nsIVersionComparator); 199 return (!oldRdfVersion || versionChecker.compare(oldRdfVersion, this._rdfVersion) < 0) 200 }, 201 // ************** RDF UPGRADE CODE **************************************************** 202 extUpgradeRequired: function () { 203 if (!this._extVersion) return false; 204 var oldExtVersion = this.getCurrentExtFileVersion() 205 var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"] 206 .getService(Components.interfaces.nsIVersionComparator); 207 return (!oldExtVersion || versionChecker.compare(oldExtVersion, this._extVersion) < 0) 208 }, 209 // ************** RDF UPGRADE CODE **************************************************** 210 rdfUpgrade: function () { 211 var currentVersion = this.getCurrentRDFFileVersion(); 212 Log.debug("checking for previous version of rdf, found " + 213 currentVersion + " - rdf-upgrade required.") 214 switch (currentVersion) { 215 case null: 216 case "0.0.1": 217 case "0.0.2": 218 this._createRDFContainers(); // no break 219 case "0.0.3": 220 this._tagDefaultSMTP(); 221 case "0.0.4": 222 default: 223 this._createAccountInfoContainers(); 224 } 225 this.storeRDFVersion(); 226 Log.debug("rdf-upgrade to " + this.getCurrentRDFFileVersion() + " done."); 227 }, 228 // ************** RDF UPGRADE CODE **************************************************** 229 // only used for upgrade to 0.0.3 - loop through all ressources. 230 _transferAllResources: function () { 231 Log.debug("upgrade: transferAllResources"); 232 var enumerator = this._rdfDataSource.GetAllResources(); 233 while (enumerator && enumerator.hasMoreElements()) { 234 var resource = enumerator.getNext(); 235 resource.QueryInterface(Components.interfaces.nsIRDFResource); 236 237 var type; 238 var name; 239 if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSEmail + "/", "i"))) { 240 type = "email"; 241 name = RegExp.rightContext 242 } else if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSNewsgroup + "/", "i"))) { 243 type = "newsgroup"; 244 name = RegExp.rightContext 245 } else if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSMaillist + "/", "i"))) { 246 type = "maillist"; 247 name = RegExp.rightContext 248 } else continue; 249 250 var container = this.getContainer(type); 251 this._setRDFValue(resource, "name", name); 252 253 if (container.IndexOf(resource) == -1) container.AppendElement(resource); 254 } 255 }, 256 // ************** RDF UPGRADE CODE **************************************************** 257 _tagDefaultSMTP: function () { 258 Log.debug("upgrade: tagDefaultSMTP"); 259 for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) { 260 var enumerator = this.getContainer(treeType).GetElements(); 261 while (enumerator && enumerator.hasMoreElements()) { 262 var resource = enumerator.getNext(); 263 resource.QueryInterface(Components.interfaces.nsIRDFResource); 264 var smtp = this._getRDFValue(resource, "smtp") 265 if (!smtp || smtp == "") this._setRDFValue(resource, "smtp", DEFAULT_SMTP_TAG); 266 } 267 } 268 }, 269 // ************** RDF UPGRADE CODE **************************************************** 270 _createAccountInfoContainers: function () { 271 Log.debug("upgrade: createAccountInfoContainers"); 272 var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"]. 273 getService(Components.interfaces.nsIRDFContainerUtils); 274 275 var accountRes = this._rdfService 276 .GetResource(this._rdfNS + this._rdfNSAccounts); 277 var identityRes = this._rdfService 278 .GetResource(this._rdfNS + this._rdfNSIdentities); 279 var smtpRes = this._rdfService 280 .GetResource(this._rdfNS + this._rdfNSSMTPservers); 281 this._setRDFValue(accountRes, "name", "Accounts"); 282 this._setRDFValue(identityRes, "name", "Identities"); 283 this._setRDFValue(smtpRes, "name", "SMTP-Server"); 284 285 rdfContainerUtils.MakeBag(this._rdfDataSource, accountRes); 286 rdfContainerUtils.MakeBag(this._rdfDataSource, identityRes); 287 rdfContainerUtils.MakeBag(this._rdfDataSource, smtpRes); 288 289 var accountContainer = Components.classes["@mozilla.org/rdf/container;1"]. 290 createInstance(Components.interfaces.nsIRDFContainer); 291 292 // initialize container with accountRes 293 accountContainer.Init(this._rdfDataSource, accountRes); 294 // append all new containers to accountRes 295 if (accountContainer.IndexOf(identityRes) == -1) accountContainer.AppendElement(identityRes); 296 if (accountContainer.IndexOf(smtpRes) == -1) accountContainer.AppendElement(smtpRes); 297 298 this._initContainers(); 299 this.refreshAccountInfo(); 300 }, 301 // ************** RDF UPGRADE CODE **************************************************** 302 _createRDFContainers: function () { 303 Log.debug("upgrade: createRDFContainers"); 304 var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"]. 305 getService(Components.interfaces.nsIRDFContainerUtils); 306 307 var storageRes = this._rdfService 308 .GetResource(this._rdfNS + this._rdfNSStorage); 309 var emailRes = this._rdfService 310 .GetResource(this._rdfNS + this._rdfNSEmail); 311 var maillistRes = this._rdfService 312 .GetResource(this._rdfNS + this._rdfNSMaillist); 313 var newsgroupRes = this._rdfService 314 .GetResource(this._rdfNS + this._rdfNSNewsgroup); 315 var filterRes = this._rdfService 316 .GetResource(this._rdfNS + this._rdfNSFilter); 317 this._setRDFValue(emailRes, "name", "E-Mail"); 318 this._setRDFValue(maillistRes, "name", "Mailing-List"); 319 this._setRDFValue(newsgroupRes, "name", "Newsgroup"); 320 this._setRDFValue(filterRes, "name", "Filter"); 321 322 rdfContainerUtils.MakeBag(this._rdfDataSource, storageRes); 323 rdfContainerUtils.MakeBag(this._rdfDataSource, emailRes); 324 rdfContainerUtils.MakeBag(this._rdfDataSource, maillistRes); 325 rdfContainerUtils.MakeBag(this._rdfDataSource, newsgroupRes); 326 // use a sequence for the filters, order does matter 327 rdfContainerUtils.MakeSeq(this._rdfDataSource, filterRes); 328 329 var container = Components.classes["@mozilla.org/rdf/container;1"]. 330 createInstance(Components.interfaces.nsIRDFContainer); 331 332 // initialize container with storageRes 333 container.Init(this._rdfDataSource, storageRes); 334 // append all new containers to storageRes 335 if (container.IndexOf(emailRes) == -1) container.AppendElement(emailRes); 336 if (container.IndexOf(maillistRes) == -1) container.AppendElement(maillistRes); 337 if (container.IndexOf(newsgroupRes) == -1) container.AppendElement(newsgroupRes); 338 if (container.IndexOf(filterRes) == -1) container.AppendElement(filterRes); 339 340 this._initContainers(); 341 342 this._transferAllResources(); 343 }, 344 // ************** END RDF UPGRADE CODE ************************************************ 345 // ****************************************************************************************** 346 347 getCurrentRDFFileVersion: function () { 348 return this._getRDFValue( 349 this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "rdfVersion"); 350 }, 351 352 getCurrentExtFileVersion: function () { 353 return this._getRDFValue( 354 this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "version"); 355 }, 356 357 storeRDFVersion: function () { 358 this._setRDFValue( 359 this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "rdfVersion", 360 this._rdfVersion); 361 this._flush(); 362 }, 363 364 storeExtVersion: function () { 365 this._setRDFValue( 366 this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "version", this._extVersion) 367 this._flush(); 368 }, 369 370 clean: function () { 371 this.AccountManagerObserver.unregister(); 372 this._flush(); 373 }, 374 375 _flush: function () { 376 this._rdfDataSource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); 377 this._rdfDataSource.Flush(); 378 }, 379 380 refreshAccountInfo: function () { 381 try { // will possibly fail before upgrade 382 this.cleanAccountInfo(); 383 this.storeAccountInfo(); 384 } catch (e) {}; 385 }, 386 387 cleanAccountInfo: function () { 388 Log.debug("cleanAccountInfo"); 389 390 var enumerator = this._identityContainer.GetElements(); 391 while (enumerator && enumerator.hasMoreElements()) { 392 var resource = enumerator.getNext(); 393 resource.QueryInterface(Components.interfaces.nsIRDFResource); 394 this._unsetRDFValue(resource, "identityName", this._getRDFValue(resource, "identityName")) 395 this._unsetRDFValue(resource, "fullName", this._getRDFValue(resource, "fullName")) 396 this._unsetRDFValue(resource, "email", this._getRDFValue(resource, "email")) 397 this._identityContainer.RemoveElement(resource, false); 398 } 399 400 enumerator = this._smtpContainer.GetElements(); 401 while (enumerator && enumerator.hasMoreElements()) { 402 var resource = enumerator.getNext(); 403 resource.QueryInterface(Components.interfaces.nsIRDFResource); 404 this._unsetRDFValue(resource, "label", this._getRDFValue(resource, "label")) 405 this._unsetRDFValue(resource, "hostname", this._getRDFValue(resource, "hostname")) 406 this._unsetRDFValue(resource, "username", this._getRDFValue(resource, "username")) 407 this._smtpContainer.RemoveElement(resource, false); 408 } 409 }, 410 411 getRelevantIDs: function () { 412 var relevantIDs = new Object(); 413 // search relevant Identities 414 for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) { 415 var enumerator = this.getContainer(treeType).GetElements(); 416 while (enumerator && enumerator.hasMoreElements()) { 417 var resource = enumerator.getNext(); 418 resource.QueryInterface(Components.interfaces.nsIRDFResource); 419 var id = this._getRDFValue(resource, "id") 420 if (id) { 421 if (!relevantIDs[id]) relevantIDs[id] = 1; 422 else relevantIDs[id] += 1; 423 } 424 } 425 } 426 return relevantIDs; 427 }, 428 429 searchIdentityMismatch: function () { 430 Log.debug("searchIdentityMismatch"); 431 432 var relevantIDs = this.getRelevantIDs(); 433 var mismatchIDs = []; 434 435 for (var id in relevantIDs) { 436 var found = false; 437 var accounts = getAccountsArray(); 438 var identity = null; 439 for (let acc = 0; acc < accounts.length; acc++) { 440 let account = accounts[acc]; 441 let identities = getIdentitiesArray(account); 442 for (let i = 0; i < identities.length; i++) { 443 identity = identities[i]; 444 if (id == identity.key) { 445 found = true; 446 break; 447 } 448 } 449 if (found) break; 450 } 451 var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSIdentities + "/" + id); 452 var rdfIdentityName = this._getRDFValue(resource, "identityName"); 453 var rdfEmail = this._getRDFValue(resource, "email"); 454 var rdfFullName = this._getRDFValue(resource, "fullName") 455 456 if (!found || rdfIdentityName != identity.identityName && rdfEmail != identity.email) 457 mismatchIDs.push({ 458 oldkey: id, 459 label: rdfIdentityName, 460 ext1: rdfEmail, 461 ext2: rdfFullName, 462 count: relevantIDs[id], 463 key: "" 464 }) 465 } 466 if (mismatchIDs.length > 0) { 467 Log.debug(" found mismatches on id(s)."); 468 get3PaneWindow().openDialog("chrome://v_identity/content/vI_rdfAccountMismatchDialog.xul", 0, 469 "chrome, dialog, modal, alwaysRaised, resizable=yes", "identity", mismatchIDs, 470 /* callback chance: */ 471 this).focus(); 472 return true; 473 } else { 474 Log.debug(" found no mismatch"); 475 return false; 476 } 477 }, 478 479 repairAccountMismatch: function (type, mismatchItems) { 480 var keyField = (type == "identity") ? "id" : "smtp" // field to change is 'id' or 'smtp' dependent on type 481 for (var i = 0; i < mismatchItems.length; i++) { 482 Log.debug("repairAccountMismatch change " + mismatchItems[i].oldkey + " into " + mismatchItems[i].key); 483 // search relevant Identities 484 for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) { 485 var enumerator = this.getContainer(treeType).GetElements(); 486 while (enumerator && enumerator.hasMoreElements()) { 487 var resource = enumerator.getNext(); 488 resource.QueryInterface(Components.interfaces.nsIRDFResource); 489 if (this._getRDFValue(resource, keyField) == mismatchItems[i].oldkey) { 490 if (mismatchItems[i].key == "") this._unsetRDFValue(resource, keyField, mismatchItems[i].oldkey) 491 else this._setRDFValue(resource, keyField, mismatchItems[i].key) 492 } 493 } 494 } 495 } 496 }, 497 498 getRelevantSMTPs: function () { 499 var relevantSMTPs = new Object(); 500 // search relevant SMTPs 501 for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) { 502 var enumerator = this.getContainer(treeType).GetElements(); 503 while (enumerator && enumerator.hasMoreElements()) { 504 var resource = enumerator.getNext(); 505 resource.QueryInterface(Components.interfaces.nsIRDFResource); 506 var smtp = this._getRDFValue(resource, "smtp") 507 if (smtp && smtp != DEFAULT_SMTP_TAG) { 508 if (!relevantSMTPs[smtp]) relevantSMTPs[smtp] = 1; 509 else relevantSMTPs[smtp] += 1; 510 } 511 } 512 } 513 return relevantSMTPs; 514 }, 515 516 searchSmtpMismatch: function () { 517 Log.debug("searchSmtpMismatch"); 518 519 var relevantSMTPs = this.getRelevantSMTPs(); 520 var mismatchSMTPs = []; 521 522 for (var smtp in relevantSMTPs) { 523 var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"] 524 .getService(Components.interfaces.nsISmtpService); 525 // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService 526 if (typeof (smtpService.servers) == "object") servers = smtpService.servers; 527 else servers = smtpService.smtpServers; 528 529 var found = false; 530 while (servers && servers.hasMoreElements()) { 531 var server = servers.getNext(); 532 if (server instanceof Components.interfaces.nsISmtpServer && 533 !server.redirectorType && smtp == server.key) { 534 found = true; 535 break; 536 } 537 } 538 var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSSMTPservers + "/" + smtp); 539 var rdfSMTPlabel = this._getRDFValue(resource, "label"); 540 var rdfHostname = this._getRDFValue(resource, "hostname"); 541 var rdfUsername = this._getRDFValue(resource, "username") 542 if (!found || rdfSMTPlabel != (server.description ? server.description : server.hostname) && rdfHostname != server.hostname) 543 mismatchSMTPs.push({ 544 oldkey: smtp, 545 label: rdfSMTPlabel, 546 ext1: rdfHostname, 547 ext2: rdfUsername, 548 count: relevantSMTPs[smtp], 549 key: "" 550 }) 551 } 552 if (mismatchSMTPs.length > 0) { 553 Log.debug(" found mismatches on smtp(s)."); 554 get3PaneWindow().openDialog("chrome://v_identity/content/vI_rdfAccountMismatchDialog.xul", 0, 555 "chrome, dialog, modal, alwaysRaised, resizable=yes", "smtp", mismatchSMTPs, 556 /* callback: */ 557 this).focus(); 558 return true; 559 } else { 560 Log.debug(" found no mismatch"); 561 return false; 562 } 563 }, 564 565 storeAccountInfo: function () { 566 Log.debug("storeAccounts"); 567 var accounts = getAccountsArray(); 568 for (let acc = 0; acc < accounts.length; acc++) { 569 let account = accounts[acc]; 570 let identities = getIdentitiesArray(account); 571 for (let i = 0; i < identities.length; i++) { 572 let identity = identities[i]; 573 // Log.debug("storeAccounts identity store id " + identity.key); 574 575 var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSIdentities + "/" + identity.key); 576 this._setRDFValue(resource, "identityName", identity.identityName); 577 this._setRDFValue(resource, "fullName", identity.fullName); 578 this._setRDFValue(resource, "email", identity.email); 579 580 var position = this._identityContainer.IndexOf(resource); // check for index in new recType 581 if (position != -1) this._identityContainer.InsertElementAt(resource, position, false); 582 else this._identityContainer.AppendElement(resource); 583 } 584 } 585 586 function storeSmtp(server, parent) { 587 // Log.debug("storeAccounts smtp store id " + server.key); 588 var resource = parent._rdfService.GetResource(parent._rdfNS + parent._rdfNSSMTPservers + "/" + server.key); 589 parent._setRDFValue(resource, "label", (server.description ? server.description : server.hostname)); 590 parent._setRDFValue(resource, "hostname", server.hostname); 591 parent._setRDFValue(resource, "username", server.username); 592 var position = parent._smtpContainer.IndexOf(resource); // check for index in new recType 593 if (position != -1) parent._smtpContainer.InsertElementAt(resource, position, false); 594 else parent._smtpContainer.AppendElement(resource); 595 } 596 597 var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"] 598 .getService(Components.interfaces.nsISmtpService); 599 // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService 600 if (typeof (smtpService.servers) == "object") servers = smtpService.servers; 601 else servers = smtpService.smtpServers; 602 603 while (servers && servers.hasMoreElements()) { 604 var server = servers.getNext(); 605 if (server instanceof Components.interfaces.nsISmtpServer && !server.redirectorType) storeSmtp(server, this); 606 } 607 608 // Log.debug("storeAccounts done"); 609 }, 610 611 export: function (rdfFileName) { 612 Log.debug("vI_rdfDatasource export: " + rdfFileName + "\n"); 613 var filePicker = Components.classes["@mozilla.org/filepicker;1"] 614 .createInstance(Components.interfaces.nsIFilePicker); 615 filePicker.init(get3PaneWindow(), "", Components.interfaces.nsIFilePicker.modeSave); 616 filePicker.appendFilters(Components.interfaces.nsIFilePicker.filterAll | Components.interfaces.nsIFilePicker.filterText); 617 filePicker.appendFilter("RDF Files", "*.rdf"); 618 619 if (filePicker.show() != Components.interfaces.nsIFilePicker.returnCancel) { 620 var rdfDataFile = Components.classes["@mozilla.org/file/local;1"] 621 .createInstance(Components.interfaces.nsILocalFile); 622 var file = Components.classes["@mozilla.org/file/directory_service;1"] 623 .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile); 624 625 initWithFilePath_tryDelimiters(rdfDataFile, file.path, rdfFileName); 626 rdfDataFile.copyTo(filePicker.file.parent, filePicker.file.leafName); 627 } 628 }, 629 630 _getRDFResourceForVIdentity: function (recDescription, recType) { 631 if (!this._rdfDataSource) return null; 632 if (!recDescription) { 633 Log.debug("_getRDFResourceForVIdentity: no Recipient given."); 634 return null; 635 } 636 var _rdfNSRecType = null 637 switch (recType) { 638 case "email": 639 _rdfNSRecType = this._rdfNSEmail; 640 break; 641 case "newsgroup": 642 _rdfNSRecType = this._rdfNSNewsgroup; 643 break; 644 case "maillist": 645 _rdfNSRecType = this._rdfNSMaillist; 646 break; 647 case "filter": 648 _rdfNSRecType = this._rdfNSFilter; 649 break; 650 } 651 return this._rdfService.GetResource(this._rdfNS + _rdfNSRecType + "/" + recDescription); 652 653 654 }, 655 656 removeVIdentityFromRDF: function (resource, recType) { 657 // Log.debug("removeVIdentityFromRDF " + resource.ValueUTF8); 658 this._unsetRDFValue(resource, "email", this._getRDFValue(resource, "email")) 659 this._unsetRDFValue(resource, "fullName", this._getRDFValue(resource, "fullName")) 660 this._unsetRDFValue(resource, "id", this._getRDFValue(resource, "id")) 661 this._unsetRDFValue(resource, "smtp", this._getRDFValue(resource, "smtp")) 662 this._unsetRDFValue(resource, "name", this._getRDFValue(resource, "name")) 663 664 let self = this; 665 var extras = new identityDataExtras(self, resource) 666 extras.loopThroughExtras( 667 function (extra) { 668 extra.value = self._unsetRDFValue(resource, extra.field, extra.value) 669 }); 670 671 this.getContainer(recType).RemoveElement(resource, true); 672 }, 673 674 _unsetRDFValue: function (resource, field, value) { 675 // Log.debug("_unsetRDFValue " + this._rdfService + " " + this._rdfDataSource); 676 var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field); 677 var name = this._rdfService.GetLiteral(value ? value : ""); 678 var target = this._rdfDataSource.GetTarget(resource, predicate, true); 679 if (target instanceof Components.interfaces.nsIRDFLiteral) { 680 this._rdfDataSource.Unassert(resource, predicate, name, true); 681 return null; 682 } else return value; 683 }, 684 685 // this will be used from rdfDataTree to get all RDF values, callFunction is vI.rdfDataTreeCollection.__addNewDatum 686 readAllEntriesFromRDF: function (addNewDatum, treeType, idData) { 687 // Log.debug("readAllEntriesFromRDF " + this._rdfService + " " + this._rdfDataSource + " " + this); 688 var enumerator = this.getContainer(treeType).GetElements(); 689 while (enumerator && enumerator.hasMoreElements()) { 690 var resource = enumerator.getNext(); 691 resource.QueryInterface(Components.interfaces.nsIRDFResource); 692 var name = this._getRDFValue(resource, "name") 693 var email = this._getRDFValue(resource, "email") 694 var fullName = this._getRDFValue(resource, "fullName") 695 var id = this._getRDFValue(resource, "id") 696 var smtp = this._getRDFValue(resource, "smtp") 697 var used = this._getRDFValue(resource, "timeUsed") 698 var changed = this._getRDFValue(resource, "timeChanged") 699 if (!smtp) smtp = NO_SMTP_TAG; 700 let self = this; 701 var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(self, resource)) 702 addNewDatum(resource, name, localIdentityData, idData, used, changed) 703 } 704 }, 705 706 __getDescriptionAndType: function (recipient, recipientType) { 707 if (recipientType == "addr_newsgroups") return { 708 recDesc: recipient, 709 recType: "newsgroup" 710 } else if (this.__isMailingList(recipient)) { 711 Log.debug("__getDescriptionAndType: '" + recipient + "' is MailList"); 712 return { 713 recDesc: this.__getMailListName(recipient), 714 recType: "maillist" 715 } 716 } else { 717 Log.debug("__getDescriptionAndType: '" + recipient + "' is no MailList"); 718 var localIdentityData = new identityData(recipient, null, null, null, null, null, null); 719 return { 720 recDesc: localIdentityData.combinedName, 721 recType: "email" 722 } 723 } 724 }, 725 726 // -------------------------------------------------------------------- 727 // check if recipient is a mailing list. 728 // Similiar to Thunderbird, if there are muliple cards with the same displayName the mailinglist is preferred 729 // see also https://bugzilla.mozilla.org/show_bug.cgi?id=408575 730 __isMailingList: function (recipient) { 731 let abManager = Components.classes["@mozilla.org/abmanager;1"] 732 .getService(Components.interfaces.nsIAbManager); 733 let allAddressBooks = abManager.directories; 734 while (allAddressBooks.hasMoreElements()) { 735 let ab = allAddressBooks.getNext(); 736 if (ab instanceof Components.interfaces.nsIAbDirectory && !ab.isRemote) { 737 let abdirectory = abManager.getDirectory(ab.URI + 738 "?(and(DisplayName,=," + encodeURIComponent(this.__getMailListName(recipient)) + ")(IsMailList,=,TRUE))"); 739 if (abdirectory) { 740 try { // just try, sometimes there are no childCards at all... 741 let cards = abdirectory.childCards; 742 if (cards.hasMoreElements()) return true; // only interested if there is at least one element... 743 } catch (e) {} 744 } 745 } 746 } 747 return false; 748 }, 749 750 // -------------------------------------------------------------------- 751 752 __getMailListName: function (recipient) { 753 if (recipient.match(/<[^>]*>/) || recipient.match(/$/)) { 754 var mailListName = RegExp.leftContext + RegExp.rightContext 755 mailListName = mailListName.replace(/^\s+|\s+$/g, "") 756 } 757 return mailListName; 758 }, 759 760 findMatchingFilter: function (recipient, recipientType) { 761 var recDescription = this.__getDescriptionAndType(recipient, recipientType).recDesc; 762 Log.debug("findMatchingFilter for " + recDescription); 763 var enumerator = this._filterContainer.GetElements(); 764 while (enumerator && enumerator.hasMoreElements()) { 765 var resource = enumerator.getNext(); 766 resource.QueryInterface(Components.interfaces.nsIRDFResource); 767 var filter = this._getRDFValue(resource, "name"); 768 769 const filterType = { 770 None: 0, 771 RegExp: 1, 772 StrCmp: 2 773 } 774 var recentfilterType; 775 776 if (filter == "") continue; 777 if (/^\/(.*)\/$/.exec(filter)) { 778 Log.debug("findMatchingFilter with RegExp '" + filter.replace(/\\/g, "\\\\") + "'"); 779 recentfilterType = filterType.RegExp; 780 } else { 781 Log.debug("findMatchingFilter, compare with '" + filter + "'"); 782 recentfilterType = filterType.StrCmp; 783 } 784 785 switch (recentfilterType) { 786 case filterType.RegExp: 787 try { 788 /^\/(.*)\/$/.exec(filter); 789 if (recDescription.match(new RegExp(RegExp.$1, "i"))) { 790 Log.debug("findMatchingFilter found stored data."); 791 return this._readVIdentityFromRDF(resource); 792 } 793 } catch (vErr) {}; 794 break; 795 case filterType.StrCmp: 796 if (recDescription.toLowerCase().indexOf(filter.toLowerCase()) != -1) { 797 Log.debug("findMatchingFilter found stored data."); 798 return this._readVIdentityFromRDF(resource); 799 } 800 break; 801 } 802 } 803 Log.debug("findMatchingFilter no match found."); 804 return null; 805 }, 806 807 readVIdentityFromRDF: function (recipient, recipientType) { 808 var storedRecipient = this.__getDescriptionAndType(recipient, recipientType); 809 var email = this._rdfService.GetResource(this._rdfNS + "rdf#email"); 810 var resource = this._getRDFResourceForVIdentity(storedRecipient.recDesc, storedRecipient.recType); 811 if (!resource) return null; 812 if (!this._rdfDataSource.hasArcOut(resource, email)) { 813 // no data available --> give up. 814 Log.debug("readVIdentityFromRDF no data found."); 815 return null; 816 } 817 Log.debug("readVIdentityFromRDF found stored data."); 818 819 return this._readVIdentityFromRDF(resource); 820 }, 821 822 _readVIdentityFromRDF: function (resource) { 823 var email = this._getRDFValue(resource, "email") 824 var fullName = this._getRDFValue(resource, "fullName") 825 var id = this._getRDFValue(resource, "id") 826 var smtp = this._getRDFValue(resource, "smtp") 827 if (!smtp) smtp = NO_SMTP_TAG; 828 829 let _date = new Date(); 830 this._setRDFValue(resource, "timeUsed", _date.getTime()); 831 832 Log.debug("email='" + email + 833 "' fullName='" + fullName + "' id='" + id + "' smtp='" + smtp + "'"); 834 835 let self = this; 836 var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(self, resource)) 837 return localIdentityData; 838 }, 839 840 _getRDFValue: function (resource, field) { 841 // Log.debug("_getRDFValue " + this._rdfService + " " + this._rdfDataSource + " " + this); 842 var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field); 843 var target = this._rdfDataSource.GetTarget(resource, predicate, true); 844 if (target instanceof Components.interfaces.nsIRDFLiteral) return target.Value 845 else return null; 846 }, 847 848 updateRDFFromVIdentity: function (identityData, recipientName, recipientType) { 849 var recipient = this.__getDescriptionAndType(recipientName, recipientType) 850 this.updateRDF(recipient.recDesc, recipient.recType, identityData, 851 vIprefs.get("storage_store_base_id"), 852 vIprefs.get("storage_store_SMTP"), 853 null, null, false); 854 }, 855 856 removeRDF: function (recDescription, recType) { 857 var resource = this._getRDFResourceForVIdentity(recDescription, recType); 858 if (!resource) return null; 859 this.removeVIdentityFromRDF(resource, recType); 860 return resource; 861 }, 862 863 updateRDF: function (recDescription, recType, localIdentityData, storeBaseID, storeSMTP, prevRecDescription, prevRecType, updateAllExtras) { 864 // Log.debug("(" + this._rdfNS + "): updateRDF recDescription=" + recDescription + " localIdentityData.email=" + localIdentityData.email); 865 866 // if (!localIdentityData.email) { 867 // Log.debug("updateRDF: no Sender-email for Recipient, aborting."); 868 // return; 869 // } 870 if (!recDescription || recDescription.length == 0) return; 871 872 if (!prevRecDescription) prevRecDescription = recDescription; 873 if (!prevRecType) prevRecType = recType; 874 875 var resource = this._getRDFResourceForVIdentity(prevRecDescription, prevRecType); 876 if (!resource) return; 877 // Log.debug("updateRDF " + resource.ValueUTF8); 878 879 var position = this.getContainer(recType).IndexOf(resource); // check for index in new recType 880 this.removeVIdentityFromRDF(resource, prevRecType); 881 882 resource = this._getRDFResourceForVIdentity(recDescription, recType); 883 884 this._setRDFValue(resource, "email", localIdentityData.email); 885 this._setRDFValue(resource, "fullName", localIdentityData.fullName); 886 if (storeBaseID) 887 this._setRDFValue(resource, "id", localIdentityData.id.key); 888 else this._unsetRDFValue(resource, "id", this._getRDFValue(resource, "id")) 889 if (storeSMTP && localIdentityData.smtp.key != NO_SMTP_TAG) 890 this._setRDFValue(resource, "smtp", localIdentityData.smtp.key); 891 else this._unsetRDFValue(resource, "smtp", this._getRDFValue(resource, "smtp")) 892 this._setRDFValue(resource, "name", recDescription); 893 894 if (localIdentityData.extras) { 895 let self = this; 896 localIdentityData.extras.loopThroughExtras( 897 function (extra) { 898 if (updateAllExtras || extra.active) 899 extra.value = self._setRDFValue(resource, extra.field, extra.value) 900 }); 901 // Log.debug("extras: " + localIdentityData.extras.status()); 902 } 903 904 let _date = new Date(); 905 this._setRDFValue(resource, "timeChanged", _date.getTime()); 906 907 // Log.debug("updateRDF add " + resource.ValueUTF8 + " at position " + position); 908 if (position != -1) this.getContainer(recType).InsertElementAt(resource, position, true); 909 else this.getContainer(recType).AppendElement(resource); 910 }, 911 912 _setRDFValue: function (resource, field, value) { 913 // Log.debug("_setRDFValue " + resource.ValueUTF8 + " " + field + " " + value); 914 if (!value) return value; // return if some value was not set. 915 // Log.debug("_setRDFValue " + this._rdfService + " " + this._rdfDataSource); 916 var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field); 917 var name = this._rdfService.GetLiteral(value); 918 var target = this._rdfDataSource.GetTarget(resource, predicate, true); 919 920 if (target instanceof Components.interfaces.nsIRDFLiteral) 921 this._rdfDataSource.Change(resource, predicate, target, name); 922 else this._rdfDataSource.Assert(resource, predicate, name, true); 923 return value; 924 }, 925 926 // code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html 927 AccountManagerObserver: { 928 _uninstall: false, 929 observe: function (subject, topic, data) { 930 if (topic == "am-smtpChanges" || topic == "am-acceptChanges") { 931 Log.debug("account/smtp changes observed"); 932 this.searchIdentityMismatch(); 933 this.searchSmtpMismatch(); 934 this.refreshAccountInfo(); 935 } 936 }, 937 register: function () { 938 Log.debug("register AccountManagerObserver"); 939 var obsService = Components.classes["@mozilla.org/observer-service;1"]. 940 getService(Components.interfaces.nsIObserverService) 941 obsService.addObserver(this, "am-smtpChanges", false); 942 obsService.addObserver(this, "am-acceptChanges", false); 943 }, 944 unregister: function () { 945 var obsService = Components.classes["@mozilla.org/observer-service;1"]. 946 getService(Components.interfaces.nsIObserverService) 947 try { 948 obsService.removeObserver(this, "am-smtpChanges"); 949 obsService.removeObserver(this, "am-acceptChanges"); 950 } catch (e) {}; 951 } 952 } 51 953 } 52 954 53 function initWithFilePath_tryDelimiters(_nsILocalFile, path, filename) { 54 try { 55 Log.debug("Filename try linux delimiter: '" + path + "/" + filename + "'"); 56 _nsILocalFile.initWithPath(path + "/" + filename); 57 } catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) { 58 try { 59 Log.debug("Filename try windows delimiter: '" + path + "\\" + filename + "'"); 60 _nsILocalFile.initWithPath(path + "\\" + filename); 955 956 function rdfDatasourceAccess() { 957 this._rdfDataSource = new rdfDatasource("virtualIdentity.rdf", false); 958 this.stringBundle = Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties"); 959 } 960 961 rdfDatasourceAccess.prototype = { 962 _rdfDataSource: null, 963 stringBundle: null, 964 965 clean: function () { 966 this._rdfDataSource.clean(); 967 }, 968 969 updateVIdentityFromStorage: function (recipientName, recipientType, currentIdentity, currentIdentityIsVid, isNotFirstInputElement, currentWindow) { 970 var localIdentities = new identityCollection(); 971 localIdentities.addWithoutDuplicates(this._rdfDataSource.readVIdentityFromRDF(recipientName, recipientType)); 972 if (localIdentities.number == 1) Log.debug("using data from direct match"); 973 localIdentities.addWithoutDuplicates(this._rdfDataSource.findMatchingFilter(recipientName, recipientType)); 974 975 var returnValue = {}; 976 returnValue.identityCollection = localIdentities; 977 returnValue.result = "drop"; 978 if (localIdentities.number == 0) { 979 Log.debug("updateVIdentityFromStorage no usable Storage-Data found."); 980 } else { 981 Log.debug("compare with current Identity"); 982 if (vIprefs.get("storage_getOneOnly") && // if requested to retrieve only storageID for first recipient entered 983 isNotFirstInputElement && // and it is now not the first recipient entered 984 !localIdentities.identityDataCollection[0].equalsIdentity(currentIdentity, false).equal) { // and this id is different than the current used one 985 StorageNotification.info(this.stringBundle.GetStringFromName("vident.smartIdentity.vIStorageCollidingIdentity")); 986 // returnValue.result = "drop"; // this is the default value 987 } 988 // only update fields if new Identity is different than old one. 989 else { 990 Log.debug("updateVIdentityFromStorage check if storage-data matches current Identity."); 991 var compResult = localIdentities.identityDataCollection[0].equalsIdentity(currentIdentity, true); 992 if (!compResult.equal) { 993 var warning = this.__getWarning("replaceVIdentity", recipientName, compResult.compareMatrix); 994 if (!currentIdentityIsVid || 995 !vIprefs.get("storage_warn_vI_replace") || 996 (this.__askWarning(warning, currentWindow) == "accept")) { 997 returnValue.result = "accept"; 998 } 999 } else { 1000 returnValue.result = "equal"; 61 1001 } 62 catch (NS_ERROR_FILE_UNRECOGNIZED_PATH) { 63 Log.debug("Filename not valid: '" + path + "[\\/]" + filename + "'"); 64 Log.debug("can't open rdfDatasource - storage won't work"); 65 var debugMsg = "Filename not valid: '" + path + "\\" + filename + "'\n" + 66 "Filename not valid: '" + path + "/" + filename + "'\n" + 67 "Virtual Identity Storage won't work.\n\n" + 68 "Please report this issue with filename on https://www.absorb.it/virtual-id\n\n" + 69 "You can just copy the lines below in your browser to create a ticket\n\n" + 70 "https://www.absorb.it/virtual-id/newticket?summary=RDF Filename Error&description=Filename " + path + "[\\/]" + filename + " for rdf not valid" 71 get3PaneWindow().alert(debugMsg); 72 return; 73 } 74 } 75 }; 76 77 rdfDatasource.prototype = { 78 _extVersion : null, 79 _rdfVersion : "0.0.5", 80 _rdfService : Components.classes["@mozilla.org/rdf/rdf-service;1"] 81 .getService(Components.interfaces.nsIRDFService), 82 _rdfDataSource : null, 83 _rdfFileName : null, 84 _rdfNS : "http://virtual-id.absorb.it/", 85 _rdfNSStorage : "vIStorage", 86 _rdfNSEmail : "vIStorage/email", 87 _rdfNSMaillist : "vIStorage/maillist", 88 _rdfNSNewsgroup : "vIStorage/newsgroup", 89 _rdfNSFilter : "vIStorage/filter", 90 _rdfNSAccounts : "vIAccounts", 91 _rdfNSIdentities : "vIAccounts/id", 92 _rdfNSSMTPservers : "vIAccounts/smtp", 93 94 _virtualIdentityID : "{dddd428e-5ac8-4a81-9f78-276c734f75b8}", 95 96 _emailContainer : Components.classes["@mozilla.org/rdf/container;1"] 97 .createInstance(Components.interfaces.nsIRDFContainer), 98 99 _maillistContainer : Components.classes["@mozilla.org/rdf/container;1"] 100 .createInstance(Components.interfaces.nsIRDFContainer), 101 102 _newsgroupContainer : Components.classes["@mozilla.org/rdf/container;1"] 103 .createInstance(Components.interfaces.nsIRDFContainer), 104 105 _filterContainer : Components.classes["@mozilla.org/rdf/container;1"] 106 .createInstance(Components.interfaces.nsIRDFContainer), 107 108 _identityContainer : Components.classes["@mozilla.org/rdf/container;1"] 109 .createInstance(Components.interfaces.nsIRDFContainer), 110 111 _smtpContainer : Components.classes["@mozilla.org/rdf/container;1"] 112 .createInstance(Components.interfaces.nsIRDFContainer), 113 114 getContainer : function (type) { 115 switch (type) { 116 case "email": return this._emailContainer; 117 case "maillist": return this._maillistContainer; 118 case "newsgroup": return this._newsgroupContainer; 119 case "filter": return this._filterContainer; 120 case "identity": return this._identityContainer; 121 case "smtp": return this._smtpContainer; 122 } 123 return null; 124 }, 125 126 init: function() { 127 // Log.debug("init."); 128 129 this._openRdfDataSource(); 130 if (!this._rdfDataSource) return; 131 this._initContainers(); 132 if (this.rdfUpgradeRequired()) this.rdfUpgrade(); 133 134 // store version everytime to recognize downgrades later 135 this.storeRDFVersion(); 136 137 // this.refreshAccountInfo(); 138 // Log.debug("init done."); 139 }, 140 141 _openRdfDataSource: function() { 142 // if (!this._rdfFileName || this._rdfDataSource); 143 var protoHandler = Components.classes["@mozilla.org/network/protocol;1?name=file"] 144 .getService(Components.interfaces.nsIFileProtocolHandler) 145 var newFile = Components.classes["@mozilla.org/file/local;1"] 146 .createInstance(Components.interfaces.nsILocalFile); 147 148 var file = Components.classes["@mozilla.org/file/directory_service;1"] 149 .getService(Components.interfaces.nsIProperties) 150 .get("ProfD", Components.interfaces.nsIFile); 151 152 // Log.debug("_openRdfDataSource"); 153 initWithFilePath_tryDelimiters(newFile, file.path, this._rdfFileName); 154 155 var fileURI = protoHandler.newFileURI(newFile); 156 157 Log.debug("init: read rdf from '" + fileURI.spec + "'"); 158 159 this._rdfDataSource = 160 this._rdfService.GetDataSourceBlocking(fileURI.spec); 161 162 // Log.debug("read rdf from '" + fileURI.spec + "' done." + this._rdfService); 163 }, 164 165 _initContainers: function() { 166 try { // will possibly fail before upgrade 167 var storageRes = this._rdfService 168 .GetResource(this._rdfNS + this._rdfNSEmail); 169 this._emailContainer.Init(this._rdfDataSource, storageRes); 170 storageRes = this._rdfService 171 .GetResource(this._rdfNS + this._rdfNSMaillist); 172 this._maillistContainer.Init(this._rdfDataSource, storageRes); 173 storageRes = this._rdfService 174 .GetResource(this._rdfNS + this._rdfNSNewsgroup); 175 this._newsgroupContainer.Init(this._rdfDataSource, storageRes); 176 storageRes = this._rdfService 177 .GetResource(this._rdfNS + this._rdfNSFilter); 178 this._filterContainer.Init(this._rdfDataSource, storageRes); 179 storageRes = this._rdfService 180 .GetResource(this._rdfNS + this._rdfNSIdentities); 181 this._identityContainer.Init(this._rdfDataSource, storageRes); 182 storageRes = this._rdfService 183 .GetResource(this._rdfNS + this._rdfNSSMTPservers); 184 this._smtpContainer.Init(this._rdfDataSource, storageRes); 185 } catch (e) { }; 186 }, 187 188 // ****************************************************************************************** 189 // ************** BEGIN RDF UPGRADE CODE ********************************************** 190 rdfUpgradeRequired: function() { 191 var oldRdfVersion = this.getCurrentRDFFileVersion(); 192 var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"] 193 .getService(Components.interfaces.nsIVersionComparator); 194 return (!oldRdfVersion || versionChecker.compare(oldRdfVersion, this._rdfVersion) < 0) 195 }, 196 // ************** RDF UPGRADE CODE **************************************************** 197 extUpgradeRequired: function() { 198 if (!this._extVersion) return false; 199 var oldExtVersion = this.getCurrentExtFileVersion() 200 var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"] 201 .getService(Components.interfaces.nsIVersionComparator); 202 return (!oldExtVersion || versionChecker.compare(oldExtVersion, this._extVersion) < 0) 203 }, 204 // ************** RDF UPGRADE CODE **************************************************** 205 rdfUpgrade : function() { 206 var currentVersion = this.getCurrentRDFFileVersion(); 207 Log.debug("checking for previous version of rdf, found " + 208 currentVersion + " - rdf-upgrade required.") 209 switch (currentVersion) { 210 case null: 211 case "0.0.1": 212 case "0.0.2": 213 this._createRDFContainers(); // no break 214 case "0.0.3": 215 this._tagDefaultSMTP(); 216 case "0.0.4": 217 default: 218 this._createAccountInfoContainers(); 219 } 220 this.storeRDFVersion(); 221 Log.debug("rdf-upgrade to " + this.getCurrentRDFFileVersion() + " done."); 222 }, 223 // ************** RDF UPGRADE CODE **************************************************** 224 // only used for upgrade to 0.0.3 - loop through all ressources. 225 _transferAllResources : function () { 226 Log.debug("upgrade: transferAllResources"); 227 var enumerator = this._rdfDataSource.GetAllResources(); 228 while (enumerator && enumerator.hasMoreElements()) { 229 var resource = enumerator.getNext(); 230 resource.QueryInterface(Components.interfaces.nsIRDFResource); 231 232 var type; var name; 233 if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSEmail + "/", "i"))) 234 { type = "email"; name = RegExp.rightContext } 235 else if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSNewsgroup + "/", "i"))) 236 { type = "newsgroup"; name = RegExp.rightContext } 237 else if (resource.ValueUTF8.match(new RegExp(this._rdfNS + this._rdfNSMaillist + "/", "i"))) 238 { type = "maillist"; name = RegExp.rightContext } 239 else continue; 240 241 var container = this.getContainer(type); 242 this._setRDFValue(resource, "name", name); 243 244 if (container.IndexOf(resource) == -1) container.AppendElement(resource); 245 } 246 }, 247 // ************** RDF UPGRADE CODE **************************************************** 248 _tagDefaultSMTP: function() { 249 Log.debug("upgrade: tagDefaultSMTP"); 250 for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) { 251 var enumerator = this.getContainer(treeType).GetElements(); 252 while (enumerator && enumerator.hasMoreElements()) { 253 var resource = enumerator.getNext(); 254 resource.QueryInterface(Components.interfaces.nsIRDFResource); 255 var smtp = this._getRDFValue(resource, "smtp") 256 if (!smtp || smtp == "") this._setRDFValue(resource, "smtp", DEFAULT_SMTP_TAG); 257 } 258 } 259 }, 260 // ************** RDF UPGRADE CODE **************************************************** 261 _createAccountInfoContainers: function() { 262 Log.debug("upgrade: createAccountInfoContainers"); 263 var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"]. 264 getService(Components.interfaces.nsIRDFContainerUtils); 265 266 var accountRes = this._rdfService 267 .GetResource(this._rdfNS + this._rdfNSAccounts); 268 var identityRes = this._rdfService 269 .GetResource(this._rdfNS + this._rdfNSIdentities); 270 var smtpRes = this._rdfService 271 .GetResource(this._rdfNS + this._rdfNSSMTPservers); 272 this._setRDFValue(accountRes, "name", "Accounts"); 273 this._setRDFValue(identityRes, "name", "Identities"); 274 this._setRDFValue(smtpRes, "name", "SMTP-Server"); 275 276 rdfContainerUtils.MakeBag(this._rdfDataSource, accountRes); 277 rdfContainerUtils.MakeBag(this._rdfDataSource, identityRes); 278 rdfContainerUtils.MakeBag(this._rdfDataSource, smtpRes); 279 280 var accountContainer = Components.classes["@mozilla.org/rdf/container;1"]. 281 createInstance(Components.interfaces.nsIRDFContainer); 282 283 // initialize container with accountRes 284 accountContainer.Init(this._rdfDataSource, accountRes); 285 // append all new containers to accountRes 286 if (accountContainer.IndexOf(identityRes) == -1) accountContainer.AppendElement(identityRes); 287 if (accountContainer.IndexOf(smtpRes) == -1) accountContainer.AppendElement(smtpRes); 288 289 this._initContainers(); 290 this.refreshAccountInfo(); 291 }, 292 // ************** RDF UPGRADE CODE **************************************************** 293 _createRDFContainers: function() { 294 Log.debug("upgrade: createRDFContainers"); 295 var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"]. 296 getService(Components.interfaces.nsIRDFContainerUtils); 297 298 var storageRes = this._rdfService 299 .GetResource(this._rdfNS + this._rdfNSStorage); 300 var emailRes = this._rdfService 301 .GetResource(this._rdfNS + this._rdfNSEmail); 302 var maillistRes = this._rdfService 303 .GetResource(this._rdfNS + this._rdfNSMaillist); 304 var newsgroupRes = this._rdfService 305 .GetResource(this._rdfNS + this._rdfNSNewsgroup); 306 var filterRes = this._rdfService 307 .GetResource(this._rdfNS + this._rdfNSFilter); 308 this._setRDFValue(emailRes, "name", "E-Mail"); 309 this._setRDFValue(maillistRes, "name", "Mailing-List"); 310 this._setRDFValue(newsgroupRes, "name", "Newsgroup"); 311 this._setRDFValue(filterRes, "name", "Filter"); 312 313 rdfContainerUtils.MakeBag(this._rdfDataSource, storageRes); 314 rdfContainerUtils.MakeBag(this._rdfDataSource, emailRes); 315 rdfContainerUtils.MakeBag(this._rdfDataSource, maillistRes); 316 rdfContainerUtils.MakeBag(this._rdfDataSource, newsgroupRes); 317 // use a sequence for the filters, order does matter 318 rdfContainerUtils.MakeSeq(this._rdfDataSource, filterRes); 319 320 var container = Components.classes["@mozilla.org/rdf/container;1"]. 321 createInstance(Components.interfaces.nsIRDFContainer); 322 323 // initialize container with storageRes 324 container.Init(this._rdfDataSource, storageRes); 325 // append all new containers to storageRes 326 if (container.IndexOf(emailRes) == -1) container.AppendElement(emailRes); 327 if (container.IndexOf(maillistRes) == -1) container.AppendElement(maillistRes); 328 if (container.IndexOf(newsgroupRes) == -1) container.AppendElement(newsgroupRes); 329 if (container.IndexOf(filterRes) == -1) container.AppendElement(filterRes); 330 331 this._initContainers(); 332 333 this._transferAllResources(); 334 }, 335 // ************** END RDF UPGRADE CODE ************************************************ 336 // ****************************************************************************************** 337 338 getCurrentRDFFileVersion: function() { 339 return this._getRDFValue( 340 this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "rdfVersion"); 341 }, 342 343 getCurrentExtFileVersion: function() { 344 return this._getRDFValue( 345 this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "version"); 346 }, 347 348 storeRDFVersion: function() { 349 this._setRDFValue( 350 this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "rdfVersion", 351 this._rdfVersion); 352 this._flush(); 353 }, 354 355 storeExtVersion: function() { 356 this._setRDFValue( 357 this._rdfService.GetResource(this._rdfNS + "virtualIdentity"), "version", this._extVersion) 358 this._flush(); 359 }, 360 361 clean : function() { 362 this.AccountManagerObserver.unregister(); 363 this._flush(); 364 }, 365 366 _flush : function() { 367 this._rdfDataSource.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource); 368 this._rdfDataSource.Flush(); 369 }, 370 371 refreshAccountInfo : function() { 372 try { // will possibly fail before upgrade 373 this.cleanAccountInfo(); this.storeAccountInfo(); 374 } catch (e) {}; 375 }, 376 377 cleanAccountInfo : function() { 378 Log.debug("cleanAccountInfo"); 379 380 var enumerator = this._identityContainer.GetElements(); 381 while (enumerator && enumerator.hasMoreElements()) { 382 var resource = enumerator.getNext(); 383 resource.QueryInterface(Components.interfaces.nsIRDFResource); 384 this._unsetRDFValue(resource, "identityName", this._getRDFValue(resource, "identityName")) 385 this._unsetRDFValue(resource, "fullName", this._getRDFValue(resource, "fullName")) 386 this._unsetRDFValue(resource, "email", this._getRDFValue(resource, "email")) 387 this._identityContainer.RemoveElement(resource, false); 388 } 389 390 enumerator = this._smtpContainer.GetElements(); 391 while (enumerator && enumerator.hasMoreElements()) { 392 var resource = enumerator.getNext(); 393 resource.QueryInterface(Components.interfaces.nsIRDFResource); 394 this._unsetRDFValue(resource, "label", this._getRDFValue(resource, "label")) 395 this._unsetRDFValue(resource, "hostname", this._getRDFValue(resource, "hostname")) 396 this._unsetRDFValue(resource, "username", this._getRDFValue(resource, "username")) 397 this._smtpContainer.RemoveElement(resource, false); 398 } 399 }, 400 401 getRelevantIDs : function() { 402 var relevantIDs = new Object(); 403 // search relevant Identities 404 for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) { 405 var enumerator = this.getContainer(treeType).GetElements(); 406 while (enumerator && enumerator.hasMoreElements()) { 407 var resource = enumerator.getNext(); 408 resource.QueryInterface(Components.interfaces.nsIRDFResource); 409 var id = this._getRDFValue(resource, "id") 410 if (id) { 411 if (!relevantIDs[id]) relevantIDs[id] = 1; else relevantIDs[id] += 1; 412 } 413 } 414 } 415 return relevantIDs; 416 }, 417 418 searchIdentityMismatch : function() { 419 Log.debug("searchIdentityMismatch"); 420 421 var relevantIDs = this.getRelevantIDs(); 422 var mismatchIDs = []; 423 424 for (var id in relevantIDs) { 425 var found = false; 426 var accounts = getAccountsArray(); 427 var identity = null; 428 for (let acc = 0; acc < accounts.length; acc++) { 429 let account = accounts[acc]; 430 let identities = getIdentitiesArray(account); 431 for (let i = 0; i < identities.length; i++) { 432 identity = identities[i]; 433 if (id == identity.key) { found = true; break; } 434 } 435 if (found) break; 436 } 437 var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSIdentities + "/" + id); 438 var rdfIdentityName = this._getRDFValue(resource, "identityName"); 439 var rdfEmail = this._getRDFValue(resource, "email"); 440 var rdfFullName = this._getRDFValue(resource, "fullName") 441 442 if ( !found || rdfIdentityName != identity.identityName && rdfEmail != identity.email) 443 mismatchIDs.push( { oldkey: id, label : rdfIdentityName, ext1: rdfEmail, ext2: rdfFullName, count: relevantIDs[id], key: "" } ) 444 } 445 if (mismatchIDs.length > 0) { 446 Log.debug(" found mismatches on id(s)."); 447 get3PaneWindow().openDialog("chrome://v_identity/content/vI_rdfAccountMismatchDialog.xul",0, 448 "chrome, dialog, modal, alwaysRaised, resizable=yes", "identity", mismatchIDs, 449 /* callback chance: */ this).focus(); 450 return true; 451 } 452 else { 453 Log.debug(" found no mismatch"); 454 return false; 455 } 456 }, 457 458 repairAccountMismatch : function(type, mismatchItems) { 459 var keyField = (type == "identity")?"id":"smtp" // field to change is 'id' or 'smtp' dependent on type 460 for (var i = 0; i < mismatchItems.length; i++) { 461 Log.debug("repairAccountMismatch change " + mismatchItems[i].oldkey + " into " + mismatchItems[i].key); 462 // search relevant Identities 463 for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) { 464 var enumerator = this.getContainer(treeType).GetElements(); 465 while (enumerator && enumerator.hasMoreElements()) { 466 var resource = enumerator.getNext(); 467 resource.QueryInterface(Components.interfaces.nsIRDFResource); 468 if (this._getRDFValue(resource, keyField) == mismatchItems[i].oldkey) { 469 if (mismatchItems[i].key == "") this._unsetRDFValue(resource, keyField, mismatchItems[i].oldkey) 470 else this._setRDFValue(resource, keyField, mismatchItems[i].key) 471 } 472 } 473 } 474 } 475 }, 476 477 getRelevantSMTPs : function() { 478 var relevantSMTPs = new Object(); 479 // search relevant SMTPs 480 for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) { 481 var enumerator = this.getContainer(treeType).GetElements(); 482 while (enumerator && enumerator.hasMoreElements()) { 483 var resource = enumerator.getNext(); 484 resource.QueryInterface(Components.interfaces.nsIRDFResource); 485 var smtp = this._getRDFValue(resource, "smtp") 486 if (smtp && smtp != DEFAULT_SMTP_TAG) { 487 if (!relevantSMTPs[smtp]) relevantSMTPs[smtp] = 1; else relevantSMTPs[smtp] += 1; 488 } 489 } 490 } 491 return relevantSMTPs; 492 }, 493 494 searchSmtpMismatch : function() { 495 Log.debug("searchSmtpMismatch"); 496 497 var relevantSMTPs = this.getRelevantSMTPs(); 498 var mismatchSMTPs = []; 499 500 for (var smtp in relevantSMTPs) { 501 var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"] 502 .getService(Components.interfaces.nsISmtpService); 503 // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService 504 if (typeof(smtpService.servers) == "object") servers = smtpService.servers; 505 else servers = smtpService.smtpServers; 506 507 var found = false; 508 while (servers && servers.hasMoreElements()) { 509 var server = servers.getNext(); 510 if (server instanceof Components.interfaces.nsISmtpServer && 511 !server.redirectorType && smtp == server.key) { 512 found = true; break; 513 } 514 } 515 var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSSMTPservers + "/" + smtp); 516 var rdfSMTPlabel = this._getRDFValue(resource, "label"); 517 var rdfHostname = this._getRDFValue(resource, "hostname"); 518 var rdfUsername = this._getRDFValue(resource, "username") 519 if (!found || rdfSMTPlabel != (server.description?server.description:server.hostname) && rdfHostname != server.hostname) 520 mismatchSMTPs.push( { oldkey: smtp, label : rdfSMTPlabel, ext1: rdfHostname, ext2: rdfUsername, count: relevantSMTPs[smtp], key: "" } ) 521 } 522 if (mismatchSMTPs.length > 0) { 523 Log.debug(" found mismatches on smtp(s)."); 524 get3PaneWindow().openDialog("chrome://v_identity/content/vI_rdfAccountMismatchDialog.xul",0, 525 "chrome, dialog, modal, alwaysRaised, resizable=yes", "smtp", mismatchSMTPs, 526 /* callback: */ this).focus(); 527 return true; 528 } 529 else { 530 Log.debug(" found no mismatch"); 531 return false; 532 } 533 }, 534 535 storeAccountInfo : function() { 536 Log.debug("storeAccounts"); 537 var accounts = getAccountsArray(); 538 for (let acc = 0; acc < accounts.length; acc++) { 539 let account = accounts[acc]; 540 let identities = getIdentitiesArray(account); 541 for (let i = 0; i < identities.length; i++) { 542 let identity = identities[i]; 543 // Log.debug("storeAccounts identity store id " + identity.key); 544 545 var resource = this._rdfService.GetResource(this._rdfNS + this._rdfNSIdentities + "/" + identity.key); 546 this._setRDFValue(resource, "identityName", identity.identityName); 547 this._setRDFValue(resource, "fullName", identity.fullName); 548 this._setRDFValue(resource, "email", identity.email); 549 550 var position = this._identityContainer.IndexOf(resource); // check for index in new recType 551 if (position != -1) this._identityContainer.InsertElementAt(resource, position, false); 552 else this._identityContainer.AppendElement(resource); 553 } 554 } 555 556 function storeSmtp(server, parent) { 557 // Log.debug("storeAccounts smtp store id " + server.key); 558 var resource = parent._rdfService.GetResource(parent._rdfNS + parent._rdfNSSMTPservers + "/" + server.key); 559 parent._setRDFValue(resource, "label", (server.description?server.description:server.hostname)); 560 parent._setRDFValue(resource, "hostname", server.hostname); 561 parent._setRDFValue(resource, "username", server.username); 562 var position = parent._smtpContainer.IndexOf(resource); // check for index in new recType 563 if (position != -1) parent._smtpContainer.InsertElementAt(resource, position, false); 564 else parent._smtpContainer.AppendElement(resource); 565 } 566 567 var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"] 568 .getService(Components.interfaces.nsISmtpService); 569 // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService 570 if (typeof(smtpService.servers) == "object") servers = smtpService.servers; 571 else servers = smtpService.smtpServers; 572 573 while (servers && servers.hasMoreElements()) { 574 var server = servers.getNext(); 575 if (server instanceof Components.interfaces.nsISmtpServer && !server.redirectorType) storeSmtp(server, this); 576 } 577 578 // Log.debug("storeAccounts done"); 579 }, 580 581 export : function(rdfFileName) { 582 Log.debug("vI_rdfDatasource export: " + rdfFileName + "\n"); 583 var filePicker = Components.classes["@mozilla.org/filepicker;1"] 584 .createInstance(Components.interfaces.nsIFilePicker); 585 filePicker.init(get3PaneWindow(), "", Components.interfaces.nsIFilePicker.modeSave); 586 filePicker.appendFilters(Components.interfaces.nsIFilePicker.filterAll | Components.interfaces.nsIFilePicker.filterText ); 587 filePicker.appendFilter("RDF Files","*.rdf"); 588 589 if (filePicker.show() != Components.interfaces.nsIFilePicker.returnCancel) { 590 var rdfDataFile = Components.classes["@mozilla.org/file/local;1"] 591 .createInstance(Components.interfaces.nsILocalFile); 592 var file = Components.classes["@mozilla.org/file/directory_service;1"] 593 .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile); 594 595 initWithFilePath_tryDelimiters(rdfDataFile, file.path, rdfFileName); 596 rdfDataFile.copyTo(filePicker.file.parent,filePicker.file.leafName); 597 } 598 }, 599 600 _getRDFResourceForVIdentity : function (recDescription, recType) { 601 if (!this._rdfDataSource) return null; 602 if (!recDescription) { 603 Log.debug("_getRDFResourceForVIdentity: no Recipient given."); 604 return null; 605 } 606 var _rdfNSRecType = null 607 switch (recType) { 608 case "email": _rdfNSRecType = this._rdfNSEmail; break; 609 case "newsgroup" : _rdfNSRecType = this._rdfNSNewsgroup; break; 610 case "maillist" : _rdfNSRecType = this._rdfNSMaillist; break; 611 case "filter" : _rdfNSRecType = this._rdfNSFilter; break; 612 } 613 return this._rdfService.GetResource(this._rdfNS + _rdfNSRecType + "/" + recDescription); 614 615 616 }, 617 618 removeVIdentityFromRDF : function (resource, recType) { 619 // Log.debug("removeVIdentityFromRDF " + resource.ValueUTF8); 620 this._unsetRDFValue(resource, "email", this._getRDFValue(resource, "email")) 621 this._unsetRDFValue(resource, "fullName", this._getRDFValue(resource, "fullName")) 622 this._unsetRDFValue(resource, "id", this._getRDFValue(resource, "id")) 623 this._unsetRDFValue(resource, "smtp", this._getRDFValue(resource, "smtp")) 624 this._unsetRDFValue(resource, "name", this._getRDFValue(resource, "name")) 625 626 let self = this; 627 var extras = new identityDataExtras(self, resource) 628 extras.loopThroughExtras( 629 function (extra) { 630 extra.value = self._unsetRDFValue(resource, extra.field, extra.value) }); 631 632 this.getContainer(recType).RemoveElement(resource, true); 633 }, 634 635 _unsetRDFValue : function (resource, field, value) { 636 // Log.debug("_unsetRDFValue " + this._rdfService + " " + this._rdfDataSource); 637 var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field); 638 var name = this._rdfService.GetLiteral(value?value:""); 639 var target = this._rdfDataSource.GetTarget(resource, predicate, true); 640 if (target instanceof Components.interfaces.nsIRDFLiteral) { 641 this._rdfDataSource.Unassert(resource, predicate, name, true); 642 return null; 643 } 644 else return value; 645 }, 646 647 // this will be used from rdfDataTree to get all RDF values, callFunction is vI.rdfDataTreeCollection.__addNewDatum 648 readAllEntriesFromRDF : function (addNewDatum, treeType, idData) { 649 // Log.debug("readAllEntriesFromRDF " + this._rdfService + " " + this._rdfDataSource + " " + this); 650 var enumerator = this.getContainer(treeType).GetElements(); 651 while (enumerator && enumerator.hasMoreElements()) { 652 var resource = enumerator.getNext(); 653 resource.QueryInterface(Components.interfaces.nsIRDFResource); 654 var name = this._getRDFValue(resource, "name") 655 var email = this._getRDFValue(resource, "email") 656 var fullName = this._getRDFValue(resource, "fullName") 657 var id = this._getRDFValue(resource, "id") 658 var smtp = this._getRDFValue(resource, "smtp") 659 var used = this._getRDFValue(resource, "timeUsed") 660 var changed = this._getRDFValue(resource, "timeChanged") 661 if (!smtp) smtp = NO_SMTP_TAG; 662 let self = this; 663 var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(self, resource)) 664 addNewDatum (resource, name, localIdentityData, idData, used, changed) 665 } 666 }, 667 668 __getDescriptionAndType : function (recipient, recipientType) { 669 if (recipientType == "addr_newsgroups") return { recDesc : recipient, recType : "newsgroup" } 670 else if (this.__isMailingList(recipient)) { 671 Log.debug("__getDescriptionAndType: '" + recipient + "' is MailList"); 672 return { recDesc : this.__getMailListName(recipient), recType : "maillist" } 673 } 674 else { 675 Log.debug("__getDescriptionAndType: '" + recipient + "' is no MailList"); 676 var localIdentityData = new identityData(recipient, null, null, null, null, null, null); 677 return { recDesc : localIdentityData.combinedName, recType : "email" } 678 } 679 }, 680 681 // -------------------------------------------------------------------- 682 // check if recipient is a mailing list. 683 // Similiar to Thunderbird, if there are muliple cards with the same displayName the mailinglist is preferred 684 // see also https://bugzilla.mozilla.org/show_bug.cgi?id=408575 685 __isMailingList: function(recipient) { 686 let abManager = Components.classes["@mozilla.org/abmanager;1"] 687 .getService(Components.interfaces.nsIAbManager); 688 let allAddressBooks = abManager.directories; 689 while (allAddressBooks.hasMoreElements()) { 690 let ab = allAddressBooks.getNext(); 691 if (ab instanceof Components.interfaces.nsIAbDirectory && !ab.isRemote) { 692 let abdirectory = abManager.getDirectory(ab.URI + 693 "?(and(DisplayName,=," + encodeURIComponent(this.__getMailListName(recipient)) + ")(IsMailList,=,TRUE))"); 694 if (abdirectory) { 695 try { // just try, sometimes there are no childCards at all... 696 let cards = abdirectory.childCards; 697 if (cards.hasMoreElements()) return true; // only interested if there is at least one element... 698 } catch(e) { } 699 } 700 } 701 } 702 return false; 703 }, 704 705 // -------------------------------------------------------------------- 706 707 __getMailListName : function(recipient) { 708 if (recipient.match(/<[^>]*>/) || recipient.match(/$/)) { 709 var mailListName = RegExp.leftContext + RegExp.rightContext 710 mailListName = mailListName.replace(/^\s+|\s+$/g,"") 711 } 712 return mailListName; 713 }, 714 715 findMatchingFilter : function (recipient, recipientType) { 716 var recDescription = this.__getDescriptionAndType(recipient, recipientType).recDesc; 717 Log.debug("findMatchingFilter for " + recDescription); 718 var enumerator = this._filterContainer.GetElements(); 719 while (enumerator && enumerator.hasMoreElements()) { 720 var resource = enumerator.getNext(); 721 resource.QueryInterface(Components.interfaces.nsIRDFResource); 722 var filter = this._getRDFValue(resource, "name"); 723 724 const filterType = { None : 0, RegExp : 1, StrCmp : 2 } 725 var recentfilterType; 726 727 if (filter == "") continue; 728 if (/^\/(.*)\/$/.exec(filter)) { 729 Log.debug("findMatchingFilter with RegExp '" + filter.replace(/\\/g,"\\\\") + "'"); 730 recentfilterType = filterType.RegExp; 731 } 732 else { 733 Log.debug("findMatchingFilter, compare with '" + filter + "'"); 734 recentfilterType = filterType.StrCmp; 735 } 736 737 switch (recentfilterType) { 738 case filterType.RegExp: 739 try { /^\/(.*)\/$/.exec(filter); 740 if (recDescription.match(new RegExp(RegExp.$1,"i"))) { 741 Log.debug("findMatchingFilter found stored data."); 742 return this._readVIdentityFromRDF(resource); 743 } 744 } 745 catch(vErr) { }; break; 746 case filterType.StrCmp: 747 if (recDescription.toLowerCase().indexOf(filter.toLowerCase()) != -1) { 748 Log.debug("findMatchingFilter found stored data."); 749 return this._readVIdentityFromRDF(resource); 750 } 751 break; 752 } 753 } 754 Log.debug("findMatchingFilter no match found."); 755 return null; 756 }, 757 758 readVIdentityFromRDF : function (recipient, recipientType) { 759 var storedRecipient = this.__getDescriptionAndType(recipient, recipientType); 760 var email = this._rdfService.GetResource(this._rdfNS + "rdf#email"); 761 var resource = this._getRDFResourceForVIdentity(storedRecipient.recDesc, storedRecipient.recType); 762 if (!resource) return null; 763 if (!this._rdfDataSource.hasArcOut(resource, email)) { 764 // no data available --> give up. 765 Log.debug("readVIdentityFromRDF no data found."); 766 return null; 767 } 768 Log.debug("readVIdentityFromRDF found stored data."); 769 770 return this._readVIdentityFromRDF(resource); 771 }, 772 773 _readVIdentityFromRDF : function (resource) { 774 var email = this._getRDFValue(resource, "email") 775 var fullName = this._getRDFValue(resource, "fullName") 776 var id = this._getRDFValue(resource, "id") 777 var smtp = this._getRDFValue(resource, "smtp") 778 if (!smtp) smtp = NO_SMTP_TAG; 779 780 let _date = new Date(); 781 this._setRDFValue(resource, "timeUsed", _date.getTime()); 782 783 Log.debug("email='" + email + 784 "' fullName='" + fullName + "' id='" + id + "' smtp='" + smtp + "'"); 785 786 let self = this; 787 var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(self, resource)) 788 return localIdentityData; 789 }, 790 791 _getRDFValue : function (resource, field) { 792 // Log.debug("_getRDFValue " + this._rdfService + " " + this._rdfDataSource + " " + this); 793 var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field); 794 var target = this._rdfDataSource.GetTarget(resource, predicate, true); 795 if (target instanceof Components.interfaces.nsIRDFLiteral) return target.Value 796 else return null; 797 }, 798 799 updateRDFFromVIdentity : function(identityData, recipientName, recipientType) { 800 var recipient = this.__getDescriptionAndType(recipientName, recipientType) 801 this.updateRDF(recipient.recDesc, recipient.recType, identityData, 802 vIprefs.get("storage_store_base_id"), 803 vIprefs.get("storage_store_SMTP"), 804 null, null, false); 805 }, 806 807 removeRDF : function (recDescription, recType) { 808 var resource = this._getRDFResourceForVIdentity(recDescription, recType); 809 if (!resource) return null; 810 this.removeVIdentityFromRDF(resource, recType); 811 return resource; 812 }, 813 814 updateRDF : function (recDescription, recType, localIdentityData, storeBaseID, storeSMTP, prevRecDescription, prevRecType, updateAllExtras) { 815 // Log.debug("(" + this._rdfNS + "): updateRDF recDescription=" + recDescription + " localIdentityData.email=" + localIdentityData.email); 816 817 // if (!localIdentityData.email) { 818 // Log.debug("updateRDF: no Sender-email for Recipient, aborting."); 819 // return; 820 // } 821 if (!recDescription || recDescription.length == 0) return; 822 823 if (!prevRecDescription) prevRecDescription = recDescription; 824 if (!prevRecType) prevRecType = recType; 825 826 var resource = this._getRDFResourceForVIdentity(prevRecDescription, prevRecType); 827 if (!resource) return; 828 // Log.debug("updateRDF " + resource.ValueUTF8); 829 830 var position = this.getContainer(recType).IndexOf(resource); // check for index in new recType 831 this.removeVIdentityFromRDF(resource, prevRecType); 832 833 resource = this._getRDFResourceForVIdentity(recDescription, recType); 834 835 this._setRDFValue(resource, "email", localIdentityData.email); 836 this._setRDFValue(resource, "fullName", localIdentityData.fullName); 837 if (storeBaseID) 838 this._setRDFValue(resource, "id", localIdentityData.id.key); 839 else this._unsetRDFValue(resource, "id", this._getRDFValue(resource, "id")) 840 if (storeSMTP && localIdentityData.smtp.key != NO_SMTP_TAG) 841 this._setRDFValue(resource, "smtp", localIdentityData.smtp.key); 842 else this._unsetRDFValue(resource, "smtp", this._getRDFValue(resource, "smtp")) 843 this._setRDFValue(resource, "name", recDescription); 844 845 if (localIdentityData.extras) { 846 let self = this; 847 localIdentityData.extras.loopThroughExtras( 848 function (extra) { 849 if (updateAllExtras || extra.active) 850 extra.value = self._setRDFValue(resource, extra.field, extra.value) }); 851 // Log.debug("extras: " + localIdentityData.extras.status()); 852 } 853 854 let _date = new Date(); 855 this._setRDFValue(resource, "timeChanged", _date.getTime()); 856 857 // Log.debug("updateRDF add " + resource.ValueUTF8 + " at position " + position); 858 if (position != -1) this.getContainer(recType).InsertElementAt(resource, position, true); 859 else this.getContainer(recType).AppendElement(resource); 860 }, 861 862 _setRDFValue : function (resource, field, value) { 863 // Log.debug("_setRDFValue " + resource.ValueUTF8 + " " + field + " " + value); 864 if (!value) return value; // return if some value was not set. 865 // Log.debug("_setRDFValue " + this._rdfService + " " + this._rdfDataSource); 866 var predicate = this._rdfService.GetResource(this._rdfNS + "rdf#" + field); 867 var name = this._rdfService.GetLiteral(value); 868 var target = this._rdfDataSource.GetTarget(resource, predicate, true); 869 870 if (target instanceof Components.interfaces.nsIRDFLiteral) 871 this._rdfDataSource.Change(resource, predicate, target, name); 872 else this._rdfDataSource.Assert(resource, predicate, name, true); 873 return value; 874 }, 875 876 // code adapted from http://xulsolutions.blogspot.com/2006/07/creating-uninstall-script-for.html 877 AccountManagerObserver : { 878 _uninstall : false, 879 observe : function(subject, topic, data) { 880 if (topic == "am-smtpChanges" || topic == "am-acceptChanges") { 881 Log.debug("account/smtp changes observed"); 882 this.searchIdentityMismatch(); 883 this.searchSmtpMismatch(); 884 this.refreshAccountInfo(); 885 } 886 }, 887 register : function() { 888 Log.debug("register AccountManagerObserver"); 889 var obsService = Components.classes["@mozilla.org/observer-service;1"]. 890 getService(Components.interfaces.nsIObserverService) 891 obsService.addObserver(this, "am-smtpChanges", false); 892 obsService.addObserver(this, "am-acceptChanges", false); 893 }, 894 unregister : function() { 895 var obsService = Components.classes["@mozilla.org/observer-service;1"]. 896 getService(Components.interfaces.nsIObserverService) 897 try { 898 obsService.removeObserver(this, "am-smtpChanges"); 899 obsService.removeObserver(this, "am-acceptChanges"); 900 } catch(e) { }; 901 } 902 } 903 } 904 905 906 function rdfDatasourceAccess() { 907 this._rdfDataSource = new rdfDatasource("virtualIdentity.rdf", false); 908 this.stringBundle = Services.strings.createBundle("chrome://v_identity/locale/v_identity.properties"); 909 } 910 911 rdfDatasourceAccess.prototype = { 912 _rdfDataSource : null, 913 stringBundle : null, 914 915 clean : function() { 916 this._rdfDataSource.clean(); 917 }, 918 919 updateVIdentityFromStorage : function(recipientName, recipientType, currentIdentity, currentIdentityIsVid, isNotFirstInputElement, currentWindow) { 920 var localIdentities = new identityCollection(); 921 localIdentities.addWithoutDuplicates(this._rdfDataSource.readVIdentityFromRDF(recipientName, recipientType)); 922 if (localIdentities.number == 1) Log.debug("using data from direct match"); 923 localIdentities.addWithoutDuplicates(this._rdfDataSource.findMatchingFilter(recipientName, recipientType)); 924 925 var returnValue = {}; returnValue.identityCollection = localIdentities; returnValue.result = "drop"; 926 if (localIdentities.number == 0) { 927 Log.debug("updateVIdentityFromStorage no usable Storage-Data found."); 928 } 929 else { 930 Log.debug("compare with current Identity"); 931 if (vIprefs.get("storage_getOneOnly") && // if requested to retrieve only storageID for first recipient entered 932 isNotFirstInputElement && // and it is now not the first recipient entered 933 !localIdentities.identityDataCollection[0].equalsIdentity(currentIdentity, false).equal) { // and this id is different than the current used one 934 StorageNotification.info(this.stringBundle.GetStringFromName("vident.smartIdentity.vIStorageCollidingIdentity")); 935 // returnValue.result = "drop"; // this is the default value 936 } 937 // only update fields if new Identity is different than old one. 938 else { 939 Log.debug("updateVIdentityFromStorage check if storage-data matches current Identity."); 940 var compResult = localIdentities.identityDataCollection[0].equalsIdentity(currentIdentity, true); 941 if (!compResult.equal) { 942 var warning = this.__getWarning("replaceVIdentity", recipientName, compResult.compareMatrix); 943 if ( !currentIdentityIsVid || 944 !vIprefs.get("storage_warn_vI_replace") || 945 (this.__askWarning(warning, currentWindow) == "accept")) { 946 returnValue.result = "accept"; 947 } 948 } 949 else { 950 returnValue.result = "equal"; 951 } 952 } 953 } 954 return returnValue; 955 }, 956 957 storeVIdentityToAllRecipients : function(identityData, recipients, currentWindow) { 958 var multipleRecipients = (recipients.length > 1); 959 var dontUpdateMultipleNoEqual = (vIprefs.get("storage_dont_update_multiple") && multipleRecipients) 960 Log.debug("storeVIdentityToAllRecipients dontUpdateMultipleNoEqual='" + dontUpdateMultipleNoEqual + "'") 961 962 let returnValue = { update : "cancel" }; 963 for (var j = 0; j < recipients.length; j++) { 964 returnValue = this.__updateStorageFromVIdentity(identityData, recipients[j].recipient, recipients[j].recipientType, dontUpdateMultipleNoEqual, currentWindow); 965 if (returnValue.update != "accept") break; 966 } 967 return returnValue; 968 }, 969 970 getVIdentityFromAllRecipients : function(allIdentities, recipients) { 971 if (!vIprefs.get("storage")) 972 { Log.debug("Storage deactivated"); return; } 973 var initnumber = allIdentities.number; 974 for (var j = 0; j < recipients.length; j++) { 975 allIdentities.addWithoutDuplicates(this._rdfDataSource.readVIdentityFromRDF(recipients[j].recipient, recipients[j].recipientType)); 976 allIdentities.addWithoutDuplicates(this._rdfDataSource.findMatchingFilter(recipients[j].recipient, recipients[j].recipientType)); 977 } 978 Log.debug("found " + (allIdentities.number-initnumber) + " address(es)") 979 }, 980 981 __updateStorageFromVIdentity : function(identityData, recipient, recipientType, dontUpdateMultipleNoEqual, currentWindow) { 982 Log.debug("__updateStorageFromVIdentity.") 983 var storageDataByType = this._rdfDataSource.readVIdentityFromRDF(recipient, recipientType); 984 var storageDataByFilter = this._rdfDataSource.findMatchingFilter(recipient, recipientType); 985 986 // update (storing) of data by type is required if there is 987 // no data stored by type (or different data stored) and no equal filter found 988 var storageDataByTypeCompResult = storageDataByType?storageDataByType.equalsIdentity(identityData, true):null; 989 var storageDataByTypeEqual = (storageDataByType && storageDataByTypeCompResult.equal); 990 var storageDataByFilterEqual = (storageDataByFilter && storageDataByFilter.equalsIdentity(identityData, false).equal); 991 992 var doUpdate = "accept"; 993 if ( (!storageDataByType && !storageDataByFilterEqual) || 994 (!storageDataByTypeEqual && !storageDataByFilterEqual && !dontUpdateMultipleNoEqual) ) { 995 Log.debug("__updateStorageFromVIdentity updating") 996 if (storageDataByType && !storageDataByTypeEqual && vIprefs.get("storage_warn_update")) { 997 Log.debug("__updateStorageFromVIdentity overwrite warning"); 998 doUpdate = this.__askWarning(this.__getWarning("updateStorage", recipient, storageDataByTypeCompResult.compareMatrix), currentWindow); 999 } 1000 } 1001 if (doUpdate == "accept") this._rdfDataSource.updateRDFFromVIdentity(identityData, recipient, recipientType); 1002 return { update : doUpdate, storedIdentity : storageDataByType }; 1003 }, 1004 1005 __getWarning : function(warningCase, recipient, compareMatrix) { 1006 var warning = { title: null, recLabel : null, recipient : null, warning : null, css: null, query : null, class : null }; 1007 warning.title = this.stringBundle.GetStringFromName("vident." + warningCase + ".title") 1008 warning.recLabel = this.stringBundle.GetStringFromName("vident." + warningCase + ".recipient") + ":"; 1009 warning.recipient = recipient; 1010 warning.warning = 1011 "<table class='" + warningCase + "'><thead><tr><th class='col1'/>" + 1012 "<th class='col2'>" + this.stringBundle.GetStringFromName("vident." + warningCase + ".currentIdentity") + "</th>" + 1013 "<th class='col3'>" + this.stringBundle.GetStringFromName("vident." + warningCase + ".storedIdentity") + "</th>" + 1014 "</tr></thead>" + 1015 "<tbody>" + compareMatrix + "</tbody>" + 1016 "</table>" 1017 warning.css = "vI.DialogBrowser.css"; 1018 warning.query = this.stringBundle.GetStringFromName("vident." + warningCase + ".query"); 1019 warning.class = warningCase; 1020 return warning; 1021 }, 1022 1023 __askWarning : function(warning, currentWindow) { 1024 var retVar = { returnValue: null }; 1025 var answer = currentWindow.openDialog("chrome://v_identity/content/vI_Dialog.xul","", 1026 "chrome, dialog, modal, alwaysRaised, resizable=yes", 1027 warning, retVar) 1028 Log.debug("retVar.returnValue=" + retVar.returnValue) 1029 return retVar.returnValue; 1030 }, 1002 } 1003 } 1004 return returnValue; 1005 }, 1006 1007 storeVIdentityToAllRecipients: function (identityData, recipients, currentWindow) { 1008 var multipleRecipients = (recipients.length > 1); 1009 var dontUpdateMultipleNoEqual = (vIprefs.get("storage_dont_update_multiple") && multipleRecipients) 1010 Log.debug("storeVIdentityToAllRecipients dontUpdateMultipleNoEqual='" + dontUpdateMultipleNoEqual + "'") 1011 1012 let returnValue = { 1013 update: "cancel" 1014 }; 1015 for (var j = 0; j < recipients.length; j++) { 1016 returnValue = this.__updateStorageFromVIdentity(identityData, recipients[j].recipient, recipients[j].recipientType, dontUpdateMultipleNoEqual, currentWindow); 1017 if (returnValue.update != "accept") break; 1018 } 1019 return returnValue; 1020 }, 1021 1022 getVIdentityFromAllRecipients: function (allIdentities, recipients) { 1023 if (!vIprefs.get("storage")) { 1024 Log.debug("Storage deactivated"); 1025 return; 1026 } 1027 var initnumber = allIdentities.number; 1028 for (var j = 0; j < recipients.length; j++) { 1029 allIdentities.addWithoutDuplicates(this._rdfDataSource.readVIdentityFromRDF(recipients[j].recipient, recipients[j].recipientType)); 1030 allIdentities.addWithoutDuplicates(this._rdfDataSource.findMatchingFilter(recipients[j].recipient, recipients[j].recipientType)); 1031 } 1032 Log.debug("found " + (allIdentities.number - initnumber) + " address(es)") 1033 }, 1034 1035 __updateStorageFromVIdentity: function (identityData, recipient, recipientType, dontUpdateMultipleNoEqual, currentWindow) { 1036 Log.debug("__updateStorageFromVIdentity.") 1037 var storageDataByType = this._rdfDataSource.readVIdentityFromRDF(recipient, recipientType); 1038 var storageDataByFilter = this._rdfDataSource.findMatchingFilter(recipient, recipientType); 1039 1040 // update (storing) of data by type is required if there is 1041 // no data stored by type (or different data stored) and no equal filter found 1042 var storageDataByTypeCompResult = storageDataByType ? storageDataByType.equalsIdentity(identityData, true) : null; 1043 var storageDataByTypeEqual = (storageDataByType && storageDataByTypeCompResult.equal); 1044 var storageDataByFilterEqual = (storageDataByFilter && storageDataByFilter.equalsIdentity(identityData, false).equal); 1045 1046 var doUpdate = "accept"; 1047 if ((!storageDataByType && !storageDataByFilterEqual) || 1048 (!storageDataByTypeEqual && !storageDataByFilterEqual && !dontUpdateMultipleNoEqual)) { 1049 Log.debug("__updateStorageFromVIdentity updating") 1050 if (storageDataByType && !storageDataByTypeEqual && vIprefs.get("storage_warn_update")) { 1051 Log.debug("__updateStorageFromVIdentity overwrite warning"); 1052 doUpdate = this.__askWarning(this.__getWarning("updateStorage", recipient, storageDataByTypeCompResult.compareMatrix), currentWindow); 1053 } 1054 } 1055 if (doUpdate == "accept") this._rdfDataSource.updateRDFFromVIdentity(identityData, recipient, recipientType); 1056 return { 1057 update: doUpdate, 1058 storedIdentity: storageDataByType 1059 }; 1060 }, 1061 1062 __getWarning: function (warningCase, recipient, compareMatrix) { 1063 var warning = { 1064 title: null, 1065 recLabel: null, 1066 recipient: null, 1067 warning: null, 1068 css: null, 1069 query: null, 1070 class: null 1071 }; 1072 warning.title = this.stringBundle.GetStringFromName("vident." + warningCase + ".title") 1073 warning.recLabel = this.stringBundle.GetStringFromName("vident." + warningCase + ".recipient") + ":"; 1074 warning.recipient = recipient; 1075 warning.warning = 1076 "<table class='" + warningCase + "'><thead><tr><th class='col1'/>" + 1077 "<th class='col2'>" + this.stringBundle.GetStringFromName("vident." + warningCase + ".currentIdentity") + "</th>" + 1078 "<th class='col3'>" + this.stringBundle.GetStringFromName("vident." + warningCase + ".storedIdentity") + "</th>" + 1079 "</tr></thead>" + 1080 "<tbody>" + compareMatrix + "</tbody>" + 1081 "</table>" 1082 warning.css = "vI.DialogBrowser.css"; 1083 warning.query = this.stringBundle.GetStringFromName("vident." + warningCase + ".query"); 1084 warning.class = warningCase; 1085 return warning; 1086 }, 1087 1088 __askWarning: function (warning, currentWindow) { 1089 var retVar = { 1090 returnValue: null 1091 }; 1092 var answer = currentWindow.openDialog("chrome://v_identity/content/vI_Dialog.xul", "", 1093 "chrome, dialog, modal, alwaysRaised, resizable=yes", 1094 warning, retVar) 1095 Log.debug("retVar.returnValue=" + retVar.returnValue) 1096 return retVar.returnValue; 1097 }, 1031 1098 } 1032 1099 … … 1034 1101 // create with name of the file to import into 1035 1102 function rdfDatasourceImporter(rdfFileName) { 1036 1037 1103 this._rdfFileName = rdfFileName; 1104 if (this._rdfFileName) this.import(); 1038 1105 } 1039 1106 1040 1107 rdfDatasourceImporter.prototype = { 1041 _rdfService : Components.classes["@mozilla.org/rdf/rdf-service;1"] 1042 .getService(Components.interfaces.nsIRDFService), 1043 _rdfDataSource : null, 1044 _rdfFileName : null, 1045 _rdfImportDataSource : null, 1046 1047 _getMatchingIdentity : function(name, email, fullName) { 1048 var accounts = getAccountsArray(); 1049 for (let acc = 0; acc < accounts.length; acc++) { 1050 let account = accounts[acc]; 1051 let identities = getIdentitiesArray(account); 1052 for (let i = 0; i < identities.length; i++) { 1053 let identity = identities[i]; 1054 if (name == identity.identityName || (fullName == identity.fullName && email == identity.email)) return identity.key; 1055 } 1108 _rdfService: Components.classes["@mozilla.org/rdf/rdf-service;1"] 1109 .getService(Components.interfaces.nsIRDFService), 1110 _rdfDataSource: null, 1111 _rdfFileName: null, 1112 _rdfImportDataSource: null, 1113 1114 _getMatchingIdentity: function (name, email, fullName) { 1115 var accounts = getAccountsArray(); 1116 for (let acc = 0; acc < accounts.length; acc++) { 1117 let account = accounts[acc]; 1118 let identities = getIdentitiesArray(account); 1119 for (let i = 0; i < identities.length; i++) { 1120 let identity = identities[i]; 1121 if (name == identity.identityName || (fullName == identity.fullName && email == identity.email)) return identity.key; 1122 } 1123 } 1124 return null; 1125 }, 1126 1127 _getMatchingSMTP: function (label, hostname, username) { 1128 var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"] 1129 .getService(Components.interfaces.nsISmtpService); 1130 // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService 1131 if (typeof (smtpService.servers) == "object") servers = smtpService.servers; 1132 else servers = smtpService.smtpServers; 1133 1134 while (servers && servers.hasMoreElements()) { 1135 var server = servers.getNext(); 1136 if (server instanceof Components.interfaces.nsISmtpServer && !server.redirectorType) 1137 if (label == (server.description ? server.description : server.hostname) || (hostname == server.hostname && username == server.username)) 1138 return server.key; 1139 } 1140 return null; 1141 }, 1142 1143 _translateRelevantIDs: function () { 1144 var relevantIDs = this._rdfImportDataSource.getRelevantIDs(); 1145 for (var id in relevantIDs) { 1146 var resource = this._rdfService.GetResource(this._rdfImportDataSource._rdfNS + this._rdfImportDataSource._rdfNSIdentities + "/" + id); 1147 var values = { 1148 id: null, 1149 identityName: null, 1150 email: null, 1151 fullName: null 1152 } 1153 values.identityName = this._rdfImportDataSource._getRDFValue(resource, "identityName"); 1154 values.email = this._rdfImportDataSource._getRDFValue(resource, "email"); 1155 values.fullName = this._rdfImportDataSource._getRDFValue(resource, "fullName"); 1156 values.id = this._getMatchingIdentity(values.identityName, values.email, values.fullName); 1157 values.id = values.id ? values.id : "import_" + id 1158 relevantIDs[id] = values; 1159 Log.debug("import: translate relevant ID from previous '" + id + "' to current '" + relevantIDs[id].id + "'"); 1160 } 1161 return relevantIDs; 1162 }, 1163 1164 _storeMappedIDs: function (relevantIDs) { 1165 for (var id in relevantIDs) { 1166 if (relevantIDs[id].id == "import_" + id) { 1167 var resource = this._rdfService 1168 .GetResource(this._rdfDataSource._rdfNS + this._rdfDataSource._rdfNSIdentities + "/" + relevantIDs[id].id); 1169 this._rdfDataSource._setRDFValue(resource, "identityName", relevantIDs[id].identityName); 1170 this._rdfDataSource._setRDFValue(resource, "fullName", relevantIDs[id].fullName); 1171 this._rdfDataSource._setRDFValue(resource, "email", relevantIDs[id].email); 1172 1173 var position = this._rdfDataSource._identityContainer.IndexOf(resource); // check for index in new recType 1174 if (position != -1) this._rdfDataSource._identityContainer.InsertElementAt(resource, position, false); 1175 else this._rdfDataSource._identityContainer.AppendElement(resource); 1176 } 1177 } 1178 }, 1179 1180 _translateRelevantSMTPs: function () { 1181 var relevantSMTPs = this._rdfImportDataSource.getRelevantSMTPs(); 1182 for (var smtp in relevantSMTPs) { 1183 var resource = this._rdfService.GetResource(this._rdfImportDataSource._rdfNS + this._rdfImportDataSource._rdfNSSMTPservers + "/" + smtp); 1184 var values = { 1185 smtp: null, 1186 label: null, 1187 hostname: null, 1188 username: null 1189 } 1190 values.label = this._rdfImportDataSource._getRDFValue(resource, "label"); 1191 values.hostname = this._rdfImportDataSource._getRDFValue(resource, "hostname"); 1192 values.username = this._rdfImportDataSource._getRDFValue(resource, "username"); 1193 values.smtp = this._getMatchingSMTP(values.label, values.hostname, values.username); 1194 values.smtp = values.smtp ? values.smtp : "import_" + smtp; 1195 relevantSMTPs[smtp] = values; 1196 Log.debug("import: translate relevant SMTP from previous '" + smtp + "' to current '" + relevantSMTPs[smtp].smtp + "'"); 1197 } 1198 return relevantSMTPs; 1199 }, 1200 1201 _storeMappedSMTPs: function (relevantSMTPs) { 1202 for (var smtp in relevantSMTPs) { 1203 if (relevantSMTPs[smtp].smtp == "import_" + smtp) { 1204 var resource = this._rdfService 1205 .GetResource(this._rdfDataSource._rdfNS + this._rdfDataSource._rdfNSSMTPservers + "/" + relevantSMTPs[smtp].smtp); 1206 this._rdfDataSource._setRDFValue(resource, "label", relevantSMTPs[smtp].label); 1207 this._rdfDataSource._setRDFValue(resource, "hostname", relevantSMTPs[smtp].hostname); 1208 this._rdfDataSource._setRDFValue(resource, "username", relevantSMTPs[smtp].username); 1209 1210 var position = this._rdfDataSource._smtpContainer.IndexOf(resource); // check for index in new recType 1211 if (position != -1) this._rdfDataSource._smtpContainer.InsertElementAt(resource, position, false); 1212 else this._rdfDataSource._smtpContainer.AppendElement(resource); 1213 } 1214 } 1215 }, 1216 1217 import: function () { 1218 var filePicker = Components.classes["@mozilla.org/filepicker;1"] 1219 .createInstance(Components.interfaces.nsIFilePicker); 1220 1221 filePicker.init(get3PaneWindow(), "", Components.interfaces.nsIFilePicker.modeOpen); 1222 filePicker.appendFilter("RDF Files", "*.rdf"); 1223 filePicker.appendFilters(Components.interfaces.nsIFilePicker.filterText | Components.interfaces.nsIFilePicker.filterAll); 1224 1225 if (filePicker.show() == Components.interfaces.nsIFilePicker.returnOK) { 1226 Log.debug("import: preparation:"); 1227 1228 var importRdfDataFile = Components.classes["@mozilla.org/file/local;1"] 1229 .createInstance(Components.interfaces.nsILocalFile); 1230 var file = Components.classes["@mozilla.org/file/directory_service;1"] 1231 .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile); 1232 1233 initWithFilePath_tryDelimiters(importRdfDataFile, file.path, this._rdfFileName + "_import"); 1234 filePicker.file.copyTo(importRdfDataFile.parent, importRdfDataFile.leafName); 1235 1236 Log.debug("import: copied file from " + filePicker.file.path + " to " + importRdfDataFile.path + "'"); 1237 1238 // init Datasources 1239 this._rdfImportDataSource = new rdfDatasource(importRdfDataFile.leafName, true); 1240 1241 // search matching IDs and SMTPs for anyones used in import-file 1242 var relevantIDs = this._translateRelevantIDs(); 1243 var relevantSMTPs = this._translateRelevantSMTPs(); 1244 1245 Log.debug("import: preparation done."); 1246 1247 for each(let treeType in Array("email", "maillist", "newsgroup", "filter")) { 1248 // re-initialize importDataSource to point rdfService to the right Resources 1249 this._rdfImportDataSource = new rdfDatasource(importRdfDataFile.leafName, true); 1250 var container = this._rdfImportDataSource.getContainer(treeType) 1251 if (container.GetCount() == 0) continue; 1252 Log.debug("importing " + treeType + ": " + container.GetCount() + " datasets from " + this._rdfImportDataSource._rdfDataSource.URI); 1253 var enumerator = container.GetElements(); 1254 // re-initialize dataSource to point rdfService to the right Resources 1255 this._rdfDataSource = new rdfDatasource(this._rdfFileName, true); 1256 var count = 0; 1257 while (enumerator.hasMoreElements()) { 1258 var resource = enumerator.getNext(); 1259 count += 1; 1260 resource.QueryInterface(Components.interfaces.nsIRDFResource); 1261 // Log.debug(" " + count + " "); 1262 var name = this._rdfImportDataSource._getRDFValue(resource, "name") 1263 var email = this._rdfImportDataSource._getRDFValue(resource, "email") 1264 var fullName = this._rdfImportDataSource._getRDFValue(resource, "fullName") 1265 var id = this._rdfImportDataSource._getRDFValue(resource, "id") 1266 id = id ? relevantIDs[id].id : null 1267 var smtp = this._rdfImportDataSource._getRDFValue(resource, "smtp") 1268 smtp = (smtp && smtp != DEFAULT_SMTP_TAG) ? relevantSMTPs[smtp].smtp : smtp 1269 var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(this._rdfImportDataSource, resource)) 1270 1271 this._rdfDataSource.updateRDF(name, treeType, localIdentityData, false, false, null, null, true) 1272 var resource = this._rdfDataSource._getRDFResourceForVIdentity(name, treeType); 1273 if (id) this._rdfDataSource._setRDFValue(resource, "id", id); // localIdentityData can only store valid id's, this one might be a temporary invalid id 1274 if (smtp) this._rdfDataSource._setRDFValue(resource, "smtp", smtp); // localIdentityData can only store valid smtp's, this one might be a temporary invalid smtp 1056 1275 } 1057 return null; 1058 }, 1059 1060 _getMatchingSMTP : function(label, hostname, username) { 1061 var servers, smtpService = Components.classes["@mozilla.org/messengercompose/smtp;1"] 1062 .getService(Components.interfaces.nsISmtpService); 1063 // check for new https://hg.mozilla.org/comm-central/rev/fab9e5145cd4 smtpService 1064 if (typeof(smtpService.servers) == "object") servers = smtpService.servers; 1065 else servers = smtpService.smtpServers; 1066 1067 while (servers && servers.hasMoreElements()) { 1068 var server = servers.getNext(); 1069 if (server instanceof Components.interfaces.nsISmtpServer && !server.redirectorType) 1070 if (label == (server.description?server.description:server.hostname) || (hostname == server.hostname && username == server.username)) 1071 return server.key; 1072 } 1073 return null; 1074 }, 1075 1076 _translateRelevantIDs : function() { 1077 var relevantIDs = this._rdfImportDataSource.getRelevantIDs(); 1078 for (var id in relevantIDs) { 1079 var resource = this._rdfService.GetResource(this._rdfImportDataSource._rdfNS + this._rdfImportDataSource._rdfNSIdentities + "/" + id); 1080 var values = { id : null, identityName : null, email : null, fullName : null } 1081 values.identityName = this._rdfImportDataSource._getRDFValue(resource, "identityName"); 1082 values.email = this._rdfImportDataSource._getRDFValue(resource, "email"); 1083 values.fullName = this._rdfImportDataSource._getRDFValue(resource, "fullName"); 1084 values.id = this._getMatchingIdentity(values.identityName, values.email, values.fullName); 1085 values.id = values.id?values.id:"import_" + id 1086 relevantIDs[id] = values; 1087 Log.debug("import: translate relevant ID from previous '" + id + "' to current '" + relevantIDs[id].id + "'"); 1088 } 1089 return relevantIDs; 1090 }, 1091 1092 _storeMappedIDs : function(relevantIDs) { 1093 for (var id in relevantIDs) { 1094 if (relevantIDs[id].id == "import_" + id) { 1095 var resource = this._rdfService 1096 .GetResource(this._rdfDataSource._rdfNS + this._rdfDataSource._rdfNSIdentities + "/" + relevantIDs[id].id); 1097 this._rdfDataSource._setRDFValue(resource, "identityName", relevantIDs[id].identityName); 1098 this._rdfDataSource._setRDFValue(resource, "fullName", relevantIDs[id].fullName); 1099 this._rdfDataSource._setRDFValue(resource, "email", relevantIDs[id].email); 1100 1101 var position = this._rdfDataSource._identityContainer.IndexOf(resource); // check for index in new recType 1102 if (position != -1) this._rdfDataSource._identityContainer.InsertElementAt(resource, position, false); 1103 else this._rdfDataSource._identityContainer.AppendElement(resource); 1104 } 1105 } 1106 }, 1107 1108 _translateRelevantSMTPs : function() { 1109 var relevantSMTPs = this._rdfImportDataSource.getRelevantSMTPs(); 1110 for (var smtp in relevantSMTPs) { 1111 var resource = this._rdfService.GetResource(this._rdfImportDataSource._rdfNS + this._rdfImportDataSource._rdfNSSMTPservers + "/" + smtp); 1112 var values = { smtp : null, label : null, hostname : null, username : null } 1113 values.label = this._rdfImportDataSource._getRDFValue(resource, "label"); 1114 values.hostname = this._rdfImportDataSource._getRDFValue(resource, "hostname"); 1115 values.username = this._rdfImportDataSource._getRDFValue(resource, "username"); 1116 values.smtp = this._getMatchingSMTP(values.label, values.hostname, values.username); 1117 values.smtp = values.smtp?values.smtp:"import_" + smtp; 1118 relevantSMTPs[smtp] = values; 1119 Log.debug("import: translate relevant SMTP from previous '" + smtp + "' to current '" + relevantSMTPs[smtp].smtp + "'"); 1120 } 1121 return relevantSMTPs; 1122 }, 1123 1124 _storeMappedSMTPs : function(relevantSMTPs) { 1125 for (var smtp in relevantSMTPs) { 1126 if (relevantSMTPs[smtp].smtp == "import_" + smtp) { 1127 var resource = this._rdfService 1128 .GetResource(this._rdfDataSource._rdfNS + this._rdfDataSource._rdfNSSMTPservers + "/" + relevantSMTPs[smtp].smtp); 1129 this._rdfDataSource._setRDFValue(resource, "label", relevantSMTPs[smtp].label); 1130 this._rdfDataSource._setRDFValue(resource, "hostname", relevantSMTPs[smtp].hostname); 1131 this._rdfDataSource._setRDFValue(resource, "username", relevantSMTPs[smtp].username); 1132 1133 var position = this._rdfDataSource._smtpContainer.IndexOf(resource); // check for index in new recType 1134 if (position != -1) this._rdfDataSource._smtpContainer.InsertElementAt(resource, position, false); 1135 else this._rdfDataSource._smtpContainer.AppendElement(resource); 1136 } 1137 } 1138 }, 1139 1140 import : function() { 1141 var filePicker = Components.classes["@mozilla.org/filepicker;1"] 1142 .createInstance(Components.interfaces.nsIFilePicker); 1143 1144 filePicker.init(get3PaneWindow(), "", Components.interfaces.nsIFilePicker.modeOpen); 1145 filePicker.appendFilter("RDF Files","*.rdf"); 1146 filePicker.appendFilters(Components.interfaces.nsIFilePicker.filterText | Components.interfaces.nsIFilePicker.filterAll ); 1147 1148 if (filePicker.show() == Components.interfaces.nsIFilePicker.returnOK) { 1149 Log.debug("import: preparation:"); 1150 1151 var importRdfDataFile = Components.classes["@mozilla.org/file/local;1"] 1152 .createInstance(Components.interfaces.nsILocalFile); 1153 var file = Components.classes["@mozilla.org/file/directory_service;1"] 1154 .getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile); 1155 1156 initWithFilePath_tryDelimiters(importRdfDataFile, file.path, this._rdfFileName + "_import"); 1157 filePicker.file.copyTo(importRdfDataFile.parent,importRdfDataFile.leafName); 1158 1159 Log.debug("import: copied file from " + filePicker.file.path + " to " + importRdfDataFile.path + "'"); 1160 1161 // init Datasources 1162 this._rdfImportDataSource = new rdfDatasource(importRdfDataFile.leafName, true); 1163 1164 // search matching IDs and SMTPs for anyones used in import-file 1165 var relevantIDs = this._translateRelevantIDs(); 1166 var relevantSMTPs = this._translateRelevantSMTPs(); 1167 1168 Log.debug("import: preparation done."); 1169 1170 for each (let treeType in Array("email", "maillist", "newsgroup", "filter")) { 1171 // re-initialize importDataSource to point rdfService to the right Resources 1172 this._rdfImportDataSource = new rdfDatasource(importRdfDataFile.leafName, true); 1173 var container = this._rdfImportDataSource.getContainer(treeType) 1174 if (container.GetCount() == 0) continue; 1175 Log.debug("importing " + treeType + ": " + container.GetCount()+ " datasets from " + this._rdfImportDataSource._rdfDataSource.URI); 1176 var enumerator = container.GetElements(); 1177 // re-initialize dataSource to point rdfService to the right Resources 1178 this._rdfDataSource = new rdfDatasource(this._rdfFileName, true); 1179 var count = 0; 1180 while (enumerator.hasMoreElements()) { 1181 var resource = enumerator.getNext(); count += 1; 1182 resource.QueryInterface(Components.interfaces.nsIRDFResource); 1183 // Log.debug(" " + count + " "); 1184 var name = this._rdfImportDataSource._getRDFValue(resource, "name") 1185 var email = this._rdfImportDataSource._getRDFValue(resource, "email") 1186 var fullName = this._rdfImportDataSource._getRDFValue(resource, "fullName") 1187 var id = this._rdfImportDataSource._getRDFValue(resource, "id") 1188 id = id?relevantIDs[id].id:null 1189 var smtp = this._rdfImportDataSource._getRDFValue(resource, "smtp") 1190 smtp = (smtp && smtp != DEFAULT_SMTP_TAG)?relevantSMTPs[smtp].smtp:smtp 1191 var localIdentityData = new identityData(email, fullName, id, smtp, new identityDataExtras(this._rdfImportDataSource, resource)) 1192 1193 this._rdfDataSource.updateRDF(name, treeType, localIdentityData, false, false, null, null, true) 1194 var resource = this._rdfDataSource._getRDFResourceForVIdentity(name, treeType); 1195 if (id) this._rdfDataSource._setRDFValue(resource, "id", id); // localIdentityData can only store valid id's, this one might be a temporary invalid id 1196 if (smtp) this._rdfDataSource._setRDFValue(resource, "smtp", smtp); // localIdentityData can only store valid smtp's, this one might be a temporary invalid smtp 1197 } 1198 } 1199 1200 Log.debug("import: removing temporary file " + importRdfDataFile.path); 1201 this._rdfImportDataSource = null; importRdfDataFile.remove(false); 1202 Log.debug("import: import done."); 1203 1204 Log.debug("import: cleaning ID/SMTP storages:"); 1205 this._rdfDataSource = new rdfDatasource(this._rdfFileName, true); 1206 1207 this._storeMappedIDs(relevantIDs); 1208 this._rdfDataSource.searchIdentityMismatch(); 1209 this._storeMappedSMTPs(relevantSMTPs); 1210 this._rdfDataSource.searchSmtpMismatch(); 1211 1212 this._rdfDataSource.refreshAccountInfo(); 1213 this._rdfDataSource.clean(); 1214 this._rdfDataSource = null; 1215 Log.debug("import: cleaning ID/SMTP storages done."); 1216 Log.debug("IMPORT DONE."); 1217 } 1218 } 1276 } 1277 1278 Log.debug("import: removing temporary file " + importRdfDataFile.path); 1279 this._rdfImportDataSource = null; 1280 importRdfDataFile.remove(false); 1281 Log.debug("import: import done."); 1282 1283 Log.debug("import: cleaning ID/SMTP storages:"); 1284 this._rdfDataSource = new rdfDatasource(this._rdfFileName, true); 1285 1286 this._storeMappedIDs(relevantIDs); 1287 this._rdfDataSource.searchIdentityMismatch(); 1288 this._storeMappedSMTPs(relevantSMTPs); 1289 this._rdfDataSource.searchSmtpMismatch(); 1290 1291 this._rdfDataSource.refreshAccountInfo(); 1292 this._rdfDataSource.clean(); 1293 this._rdfDataSource = null; 1294 Log.debug("import: cleaning ID/SMTP storages done."); 1295 Log.debug("IMPORT DONE."); 1296 } 1297 } 1219 1298 }
Note: See TracChangeset
for help on using the changeset viewer.