如何使用nsILoginManager存储我的扩展名的密码?

时间:2012-01-07 19:26:14

标签: passwords firefox-addon

我被要求存储使用nsILoginManager的密码和用户名。但我不明白如何应用它。有人可以帮帮我吗?

我不太了解的是我应该存储的内容 - 只是密码或服务器ip +用户名+密码? (我只需要一个这样的组合,扩展不支持多个帐户。)

var hostname = 'chrome://synoext-torrents';
var formSubmitURL = null;
var httprealm = 'Synology NAS login';
var username = 'user';
var password; 
var logins = loginManager.findLogins({}, hostname, formSubmitURL, httprealm);  

只是密码存储是否正确?不确定formSubmitURL是否等于null。 如果我需要另外存储服务器IP,那么值应该是什么?应该传递hostname(我的插件ID)吗?

这是我目前存储服务器ip,用户名,密码和其他选项的代码 -

options.xul

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://synoext-torrents/locale/options.dtd">
<prefwindow id="SynoPrefWindow" title="&SynoPrefWindow.title;"
            ondialogaccept="return onDialogClosed();"
            ondialogcancel="return onDialogClosed();"
            onclose="return onDialogClosed();"
            xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    <script type="application/x-javascript"
            src="chrome://synoext-torrents/content/options.js" />
    <prefpane id="SynoPrefPane">
        <preferences>
            <preference id="server" name="extensions.synoext-torrents.server" type="string"/>
            <preference id="username" name="extensions.synoext-torrents.username" type="string"/>
            <preference id="password" name="extensions.synoext-torrents.password" type="string"/>
            <preference id="autologin" name="extensions.synoext-torrents.autologin" type="bool"/>
        </preferences>
        <groupbox id="ServerGroupBox">
            <caption label="&ServerGroupBox.Server;"/>
            <vbox>
                <label value="&ServerGroupBox.URL;" control="server"/>
                <textbox preference="server" id="server" width="300" flex="1"/>
            </vbox>
        </groupbox>
        <groupbox id="AccountGroupBox">
            <caption label="&AccountGroupBox.Account;"/>
            <vbox>
                <label value="&AccountGroupBox.Username;" control="user"/>
                <textbox preference="username" id="username" flex="1"/>
            </vbox>
            <vbox>
                <label value="&AccountGroupBox.Password;" control="password"/>
                <textbox preference="password" id="password" type="password" flex="1"/>
            </vbox>
        </groupbox>
        <groupbox id="MiscGroupBox">
            <caption label="&MiscGroupBox.Miscellaneous;"/>
            <checkbox label="&MiscGroupBox.Login;" preference="autologin"/>
        </groupbox>
    </prefpane>
</prefwindow>

options.js

function onDialogClosed()
{
    var synoext = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                  .getService(Components.interfaces.nsIWindowMediator)
                  .getMostRecentWindow("navigator:browser").synoext;

    var prefs = synoext.srv.prefs;
    var vars = synoext.vars;

    var server = prefs.getCharPref(synoext.consts.PREF_SERVER);
    var username = prefs.getCharPref(synoext.consts.PREF_USERNAME);
    var password = prefs.getCharPref(synoext.consts.PREF_PASSWORD);
    var timeout = prefs.getIntPref(synoext.consts.PREF_TIMEOUT);
    var logging = prefs.getBoolPref(synoext.consts.PREF_LOGGING);
    var autologin = prefs.getBoolPref(synoext.consts.PREF_AUTOLOGIN);

    var changed = false;
    if (server != vars.server) {
        vars.server = server;
        changed = true;
    }
    if (username != vars.username) {
        vars.username = username;
        changed = true;
    }
    if (password != vars.password) {
        vars.password = password;
        changed = true;
    }
    if (timeout != vars.timeout) {
        vars.timeout = timeout;
        changed = true;
    }
    if (logging != vars.logging) {
        vars.logging = logging;
    }
    if (autologin != vars.autologin) {
        vars.autologin = autologin;
    }
    if (changed && synoext.hasPreferences()) {
        synoext.login();
    }
}

2 个答案:

答案 0 :(得分:1)

你的问题太不明确了,你基本上是要求为你编写代码。这不是很好。

我正在使用nsILoginManager在InfoLister中存储登录名/密码,请参阅:

答案 1 :(得分:0)

这是我用过的代码 -

<强> JS

// Get password from the Login Manager
// https://developer.mozilla.org/en/Using_nsILoginManager
synoext.getPassword = function(username)
{
  var hostname = 'chrome://synoext-torrents';
  var formSubmitURL = null;
  var httprealm = 'Synology NAS login';

  try { 
    var loginManager = Components.classes["@mozilla.org/login-manager;1"]
                           .getService(Components.interfaces.nsILoginManager);
    var logins = loginManager.findLogins({}, hostname, formSubmitURL, httprealm);
    for (var i = 0; i < logins.length; i++) {
      if (logins[i].username == username) {  
         return logins[i].password;  
         break;  
      }  
    }
  }  
  catch(ex) {
    synoext.log("No nsILoginManager component class");
  }
  return '';
}

// Save password in the Login Manager
synoext.setPassword = function(username, password)
{
  var hostname = 'chrome://synoext-torrents';
  var formSubmitURL = null;
  var httprealm = 'Synology NAS login';

  try {     
    var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",  
                                                 Components.interfaces.nsILoginInfo,  
                                                 "init"); 
    var loginInfo = new nsLoginInfo(hostname, formSubmitURL, httprealm, username, password, "", "");
    // find old login 
    var loginManager = Components.classes["@mozilla.org/login-manager;1"]
                           .getService(Components.interfaces.nsILoginManager);
    var logins = loginManager.findLogins({}, hostname, formSubmitURL, httprealm);
    if (logins.length > 0) {
      loginManager.removeLogin(logins[0]); // delete it
    }
    // add new login
    loginManager.addLogin(loginInfo);
  }  
  catch(ex) {
    synoext.log("Failed to set new password");
  }    
}

<强> XUL

<prefpane id="SynoPrefPane">
  <preferences>
    ...
    <!--
      <preference id="password" name="extensions.synoext-torrents.password" type="string"/>
    -->
  </preferences>
  <vbox>
    <label value="&AccountGroupBox.Password;" control="password"/>
    <textbox id="password" type="password" flex="1"/>
  </vbox>