source: desktop/foneradownloader/trunk/chrome/content/js/fonera.js @ 2384

Last change on this file since 2384 was 2384, checked in by matthijs, 4 years ago

Remove two unused variables

File size: 11.6 KB
Line 
1/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
2
3/*
4
5 fonera.js : Fonera Javascript helper
6 (C) Fon
7 Author: Javier Monteagudo (Javier.monteagudo@fon.com)
8
9 This program is free software: you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License along
20 with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22
23*/
24
25
26
27let EXPORTED_SYMBOLS = ["Fonera"];
28
29let Fonera = {
30
31    Application : Components.classes["@mozilla.org/fuel/application;1"]
32        .getService(Components.interfaces.fuelIApplication),
33
34    Preferences : Components.classes["@mozilla.org/preferences-service;1"]
35        .getService(Components.interfaces.nsIPrefService),
36
37    nsLoginInfo : new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",
38                                             Components.interfaces.nsILoginInfo,
39                                             "init"),
40    passwordManager : Components.classes["@mozilla.org/login-manager;1"].
41        getService(Components.interfaces.nsILoginManager),
42
43    // authentication status:
44    AUTHTOKEN : "authToken",
45    authError : "ERROR", // Cannot reach the fonera
46    authFailed : "FAILED", // Cannot log in
47
48    // discs status:
49    DISKS : "disks",
50    noDisk : "NODISK", // no disk attached
51
52    // Errors:
53    LASTERROR : "foneralasterror",
54    // Events:
55    onCheckFoneraAvailable : [],
56    onAuthenticate : [],
57    onCheckDisks : [],
58
59    addEventListener : function(event, callback) {
60        try {
61            // example: event == onCheckFoneraAvailable
62            Fonera[event].push(callback);
63        } catch (e) {
64            Fonera.Application.console.log("invalid registration for event "
65                                    + event + ": " + callback + ": " + e);
66        }
67    },
68
69    removeEventListener : function(event, callback) {
70        try {
71            // example: event == onCheckFoneraAvailable
72            let eventCallbacks = Fonera[event];
73            for (let i in eventCallbacks)
74                if (callback == eventCallbacks[i])
75                    // remove from index i, 1 element
76                    eventCallbacks.splice(i,1);
77        } catch (e) {
78            Fonera.Application.console.log("invalid registration for event "
79                                    + event + ": " + callback + ": " + e);
80        }
81    },
82
83    notify : function(aEvent) {
84        for (let i in aEvent) {
85            let aCallback = aEvent[i];
86            aCallback();
87        }
88    },
89
90    getUserPref : function(preference) {
91        let Preferences = Components.classes["@mozilla.org/preferences-service;1"]
92            .getService(Components.interfaces.nsIPrefService);
93        let prefs = Preferences.getBranch("extensions.foneradownloader."); // the final . is needed
94        if (prefs.prefHasUserValue(preference))
95            return prefs.getCharPref(preference);
96        else
97            return null;
98    },
99
100    getUsername : function() {
101        return "fonero";
102    },
103
104    isPluginEnabled : function() {
105        let prefs = Fonera.Preferences.getBranch("extensions.foneradownloader."); // the final . is needed
106        if (prefs.prefHasUserValue("enabled"))
107            return prefs.getBoolPref("enabled");
108        else
109            return true;
110    },
111
112    getPassword : function() {
113        let password = '';
114        let username = Fonera.getUsername();
115
116        // retrieve password with password manager
117        try {
118            let logins = Fonera.passwordManager.findLogins({}, 'chrome://foneradownloader', null, 'Fonera user Login');
119                for (let i = 0; i < logins.length; i++) {
120                    if (logins[i].username == username) {
121                        password = logins[i].password;
122                        break;
123                    }
124                }
125        } catch(e) {
126            Fonera.Application.console.log(e);
127        }
128        return password;
129    },
130
131    // url for reaching the fonera.
132    foneraURL : function () {
133        let prefs = Fonera.Preferences.getBranch("extensions.foneradownloader."); // the final . is needed
134        let onwan = prefs.getBoolPref("onwan");
135        let password = Fonera.getPassword();
136        if (!onwan)
137            return "http://" + this.getUserPref("foneraip") + "/luci";
138        else {
139            return "https://" + this.getUsername() + ":" + encodeURIComponent(password) + "@"
140                + this.getUserPref("foneraip") + "/luci";
141        }
142    },
143
144    authenticated : function(authToken) {
145        if (!Fonera.isPluginEnabled())
146            return false;
147        return (authToken != null && authToken != Fonera.authFailed
148                && authToken != Fonera.authError);
149    },
150
151    notifyAllEvents : function() {
152        this.notify(this.onCheckFoneraAvailable);
153        this.notify(this.onAuthenticate);
154        this.notify(this.onCheckDisks);
155    },
156
157    checkFoneraAvailable: function() {
158        // do we want to re-authenticate?
159        let reAuth = false;
160        reAuth = (arguments.length == 1 && arguments[0] == true);
161        let authToken = Fonera.Application.storage.get(this.AUTHTOKEN, null);
162        if (reAuth) {
163            // disable sessions:
164            Fonera.Application.console.log("Disable session storage");
165            Fonera.Application.storage.set(this.AUTHTOKEN, null);
166            Fonera.Application.storage.set(this.DISKS, null);
167            this.notifyAllEvents();
168        }
169
170        if (!this.isPluginEnabled()) {
171            if (!reAuth) {
172                this.notifyAllEvents();
173            }
174            return;
175        }
176
177        if (!reAuth && this.authenticated(authToken)) {
178            Fonera.Application.console.log("already authenticated\n");
179            this.notify(this.onAuthenticate);
180            return;
181        }
182
183        // checks if we can reach the luci interface
184        let req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
185            .createInstance(Components.interfaces.nsIXMLHttpRequest);
186
187        let url = this.foneraURL();
188        Fonera.Application.console.log("Checking URL : " + url + "\n");
189        req.open('GET', url, true); /* asynchronous! */
190        req.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE;
191        req.onreadystatechange = function (aEvt) {
192            if (req.readyState == 4) {
193                if(req.status == 200) {
194                    Fonera.authenticate(reAuth);
195                } else {
196                    Fonera.Application.storage.set(Fonera.AUTHTOKEN, Fonera.authError);
197                    Fonera.Application.console.log("Fonera NOT ready\n");
198                }
199                Fonera.notify(Fonera.onCheckFoneraAvailable);
200            }
201        };
202        req.send(null);
203    },
204
205    authenticate: function(reAuth) {
206        let authToken = Fonera.Application.storage.get(this.AUTHTOKEN, null);
207        if (!reAuth && this.authenticated(authToken)) {
208            Fonera.Application.console.log("already authenticated\n");
209            this.notify(this.onAuthenticate);
210            return;
211        }
212
213        // Send
214        let req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
215            .createInstance(Components.interfaces.nsIXMLHttpRequest);
216        let url =  this.foneraURL() + "/fon_rpc/ff/auth";
217        let stream = JSON.stringify({"method": "plain",
218            "params" : [this.getUsername(),
219                        Fonera.getPassword()] });
220
221        Fonera.Application.console.log("Authenticating to URL : " + url + "\n");
222        Fonera.Application.console.log("POST : " + stream + "\n");
223
224        req.open('POST', url, true); /* asynchronous! */
225        req.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE;
226        req.setRequestHeader('Content-Type', "application/json");
227
228        req.onreadystatechange = function (aEvt) {
229            if (req.readyState == 4) {
230                Fonera.Application.console.log("Response :" + req.responseText + "\n");
231                if(req.status == 200) {
232                    let response = JSON.parse(req.responseText);
233                    if (response.error == null && response.result != null) {
234                        Fonera.Application.console.log(Fonera.AUTHTOKEN + " : " + response.result);
235                        Fonera.Application.storage.set(Fonera.AUTHTOKEN, response.result);
236                        // Fonera.checkDisks();
237                    } else {
238                        Fonera.Application.storage.set(Fonera.AUTHTOKEN, Fonera.authFailed);
239                        Fonera.Application.console.log("Authentication FAILED\n");
240                    }
241                    Fonera.notify(Fonera.onAuthenticate);
242                }
243            }
244        };
245        req.send(stream);
246    },
247
248    checkDisks : function() {
249        let Application = Components.classes["@mozilla.org/fuel/application;1"]
250            .getService(Components.interfaces.fuelIApplication);
251
252        let authToken = Fonera.Application.storage.get(Fonera.AUTHTOKEN, null);
253        if (!Fonera.authenticated(authToken)) {
254            Fonera.Application.console.log("Not authenticated\n");
255            return;
256        }
257
258        // https://developer.mozilla.org/En/Using_XMLHttpRequest
259        // Send
260        let req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
261            .createInstance(Components.interfaces.nsIXMLHttpRequest);
262
263        //luci/fon_rpc/ff?auth=62BAAF5E1E2A16D78C31AEB7C5F8D9C8
264        let url =  Fonera.foneraURL() + "/fon_rpc/ff?auth=" + authToken;
265        let rpcCall = {"method": "get_discs"};
266        let stream = JSON.stringify(rpcCall);
267
268        Fonera.Application.console.log("POST : " + stream + "\n");
269
270        // async even if dialog is closed:
271        req.mozBackgroundRequest = true;
272        req.open('POST', url, true); /* asynchronous! */
273        req.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE;
274        req.setRequestHeader('Content-Type', "application/json");
275
276        req.onload = function (aEvt) {
277            if (req.readyState == 4) {
278                Fonera.Application.console.log("Response :" + req.responseText + "\n");
279                if (req.status == 200) {
280                    let response = JSON.parse(req.responseText);
281                    if (response.error == null) {
282                        if (response.result == null) {
283                            Fonera.Application.console.log("No disks found");
284                            Fonera.Application.storage.set(Fonera.DISKS, Fonera.noDisk);
285                        } else {
286                            Fonera.Application.storage.set(Fonera.DISKS, response.result);
287                        }
288                    } else {
289                        Fonera.Application.console.log("Response Error: " + response.error + "\n");
290                    }
291                    Fonera.notify(Fonera.onCheckDisks);
292                } else {
293                    Fonera.Application.console.log("Http Status Error :" + req.status + "\n");
294                }
295            }
296        };
297        req.send(stream);
298    },
299
300    hasDisk : function() {
301        let disks = Fonera.Application.storage.get(Fonera.DISKS, Fonera.noDisk);
302        return (disks != Fonera.noDisk);
303    },
304
305    loadEvents : function() {
306        Fonera.addEventListener("onAuthenticate",
307                                Fonera.checkDisks);
308    },
309
310    unloadEvents : function() {
311        Fonera.removeEventListener("onAuthenticate",
312                                Fonera.checkDisks);
313    }
314
315};
Note: See TracBrowser for help on using the repository browser.