122 lines, 54 LOC, 35 covered (64%)
38 | 1 | /* ***** BEGIN LICENSE BLOCK ***** |
2 | * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
|
3 | * |
|
4 | * The contents of this file are subject to the Mozilla Public License Version |
|
5 | * 1.1 (the "License"); you may not use this file except in compliance with |
|
6 | * the License. You may obtain a copy of the License at |
|
7 | * http://www.mozilla.org/MPL/ |
|
8 | * |
|
9 | * Software distributed under the License is distributed on an "AS IS" basis, |
|
10 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License |
|
11 | * for the specific language governing rights and limitations under the |
|
12 | * License. |
|
13 | * |
|
14 | * The Original Code is Bookmarks Sync. |
|
15 | * |
|
16 | * The Initial Developer of the Original Code is Mozilla. |
|
17 | * Portions created by the Initial Developer are Copyright (C) 2007 |
|
18 | * the Initial Developer. All Rights Reserved. |
|
19 | * |
|
20 | * Contributor(s): |
|
21 | * Dan Mills <thunder@mozilla.com> |
|
22 | * |
|
23 | * Alternatively, the contents of this file may be used under the terms of |
|
24 | * either the GNU General Public License Version 2 or later (the "GPL"), or |
|
25 | * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), |
|
26 | * in which case the provisions of the GPL or the LGPL are applicable instead |
|
27 | * of those above. If you wish to allow use of your version of this file only |
|
28 | * under the terms of either the GPL or the LGPL, and not to allow others to |
|
29 | * use your version of this file under the terms of the MPL, indicate your |
|
30 | * decision by deleting the provisions above and replace them with the notice |
|
31 | * and other provisions required by the GPL or the LGPL. If you do not delete |
|
32 | * the provisions above, a recipient may use your version of this file under |
|
33 | * the terms of any one of the MPL, the GPL or the LGPL. |
|
34 | * |
|
35 | * ***** END LICENSE BLOCK ***** */ |
|
36 | ||
380 | 37 | const EXPORTED_SYMBOLS = ['Identity', 'ID']; |
38 | ||
152 | 39 | const Cc = Components.classes; |
152 | 40 | const Ci = Components.interfaces; |
152 | 41 | const Cr = Components.results; |
152 | 42 | const Cu = Components.utils; |
43 | ||
190 | 44 | Cu.import("resource://weave/ext/Sync.js"); |
190 | 45 | Cu.import("resource://weave/constants.js"); |
190 | 46 | Cu.import("resource://weave/log4moz.js"); |
190 | 47 | Cu.import("resource://weave/util.js"); |
48 | ||
266 | 49 | Utils.lazy(this, 'ID', IDManager); |
50 | ||
51 | // For storing identities we'll use throughout Weave |
|
114 | 52 | function IDManager() { |
190 | 53 | this._ids = {}; |
54 | } |
|
76 | 55 | IDManager.prototype = { |
6143 | 56 | get: function IDMgr_get(name) { |
18201 | 57 | if (name in this._ids) |
24268 | 58 | return this._ids[name]; |
59 | return null; |
|
60 | }, |
|
152 | 61 | set: function IDMgr_set(name, id) { |
304 | 62 | this._ids[name] = id; |
152 | 63 | return id; |
64 | }, |
|
190 | 65 | del: function IDMgr_del(name) { |
66 | delete this._ids[name]; |
|
67 | } |
|
68 | }; |
|
69 | ||
70 | /* |
|
71 | * Identity |
|
72 | * These objects hold a realm, username, and password |
|
73 | * They can hold a password in memory, but will try to fetch it from |
|
74 | * the password manager if it's not set. |
|
75 | * FIXME: need to rethink this stuff as part of a bigger identity mgmt framework |
|
76 | */ |
|
77 | ||
157 | 78 | function Identity(realm, username, password) { |
243 | 79 | this.realm = realm; |
243 | 80 | this.username = username; |
324 | 81 | this._password = password; |
82 | } |
|
76 | 83 | Identity.prototype = { |
247 | 84 | get password() { |
85 | // Look up the password then cache it |
|
513 | 86 | if (this._password == null) |
584 | 87 | for each (let login in this._logins) |
88 | if (login.username.toLowerCase() == this.username) |
|
584 | 89 | this._password = login.password; |
342 | 90 | return this._password; |
91 | }, |
|
92 | ||
266 | 93 | set password(value) this._password = value, |
94 | ||
76 | 95 | persist: function persist() { |
96 | // Clean up any existing passwords unless it's what we're persisting |
|
97 | let exists = false; |
|
98 | for each (let login in this._logins) { |
|
99 | if (login.username == this.username && login.password == this._password) |
|
100 | exists = true; |
|
101 | else |
|
102 | Svc.Login.removeLogin(login); |
|
103 | } |
|
104 | ||
105 | // No need to create the login after clearing out the other ones |
|
106 | let log = Log4Moz.repository.getLogger("Identity"); |
|
107 | if (exists) { |
|
108 | log.trace("Skipping persist: " + this.realm + " for " + this.username); |
|
109 | return; |
|
110 | } |
|
111 | ||
112 | // Add the new username/password |
|
113 | log.trace("Persisting " + this.realm + " for " + this.username); |
|
114 | let nsLoginInfo = new Components.Constructor( |
|
115 | "@mozilla.org/login-manager/loginInfo;1", Ci.nsILoginInfo, "init"); |
|
116 | let newLogin = new nsLoginInfo(PWDMGR_HOST, null, this.realm, |
|
117 | this.username, this.password, "", ""); |
|
118 | Svc.Login.addLogin(newLogin); |
|
119 | }, |
|
120 | ||
1796 | 121 | get _logins() Svc.Login.findLogins({}, PWDMGR_HOST, null, this.realm) |
38 | 122 | }; |