Skip to content

Instantly share code, notes, and snippets.

@franziskuskiefer
Last active June 13, 2019 13:09
Show Gist options
  • Save franziskuskiefer/00c096ce9727fbc602e1e2575395c350 to your computer and use it in GitHub Desktop.
Save franziskuskiefer/00c096ce9727fbc602e1e2575395c350 to your computer and use it in GitHub Desktop.
export passwords from Firefox password manager
var {
classes: Cc,
interfaces: Ci
}
= Components;
var tokendb = Cc['@mozilla.org/security/pk11tokendb;1'].createInstance(Ci.nsIPK11TokenDB);
var token = tokendb.getInternalKeyToken();
try {
token.login(true);
} catch (e) {
}
var passwordmanager = Cc['@mozilla.org/login-manager;1'].getService(Ci.nsILoginManager);
var signons = passwordmanager.getAllLogins({
});
var json = JSON.stringify(signons);
// console.log(json);
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
file.initWithPath('/Users/franziskus/passwords.json');
var filoutputStream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
filoutputStream.init(file, 4 | 8, 420, 0);
filoutputStream.write(json, json.length);
filoutputStream.close();
function escapeXml(unsafe) {
if (!unsafe) {
return '';
}
return unsafe.replace(/[<>&'"]/g, function (c) {
switch (c) {
case '<':
return '&lt;';
case '>':
return '&gt;';
case '&':
return '&amp;';
case '\'':
return '&apos;';
case '"':
return '&quot;';
}
});
}
var {
classes: Cc,
interfaces: Ci
}
= Components;
var tokendb = Cc['@mozilla.org/security/pk11tokendb;1'].createInstance(Ci.nsIPK11TokenDB);
var token = tokendb.getInternalKeyToken();
token.login(true);
var passwordmanager = Cc['@mozilla.org/login-manager;1'].getService(Ci.nsILoginManager);
var signons = passwordmanager.getAllLogins({
});
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
file.initWithPath('/home/franziskus/passwords.xml');
var filoutputStream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
filoutputStream.init(file, 4 | 8, 420, 0);
var xmlHeader = '<?xml version="1.0" encoding="UTF-8"?>\n<pwlist>\n';
filoutputStream.write(xmlHeader, xmlHeader.length);
for (var i = 0; i < signons.length; i++) {
var host = escapeXml(signons[i].hostname);
var password = escapeXml(signons[i].password);
var user = escapeXml(signons[i].username);
// put into notes
var userf = escapeXml(signons[i].usernameField);
var passwordf = escapeXml(signons[i].passwordField);
var submiturl = escapeXml(signons[i].formSubmitURL);
var realm = escapeXml(signons[i].httpRealm);
// build xml
var group = '\t<group>Firefox</group>\n';
var title = '\t<title>' + user + '@' + host + '</title>\n';
var username = '\t<username>' + user + '</username>\n';
var url = '\t<url>' + host + '</url>\n' // TODO: escape
var pwd = '\t<password>' + password + '</password>\n'
var notes = '\t<notes>\n\t\t' + userf + '\n\t\t' + passwordf + '\n\t\t' + submiturl + '\t\t\n' + realm + '\n</notes>\n';
// TODO: <uuid>4d9a9420ac7c4a8ae688762eac8871a9</uuid>
var entryStart = '<pwentry>\n';
filoutputStream.write(entryStart, entryStart.length);
filoutputStream.write(group, group.length);
filoutputStream.write(title, title.length);
filoutputStream.write(username, username.length);
filoutputStream.write(url, url.length);
filoutputStream.write(pwd, pwd.length);
filoutputStream.write(notes, notes.length);
var entryEnd = '</pwentry>\n';
filoutputStream.write(entryEnd, entryEnd.length);
} //var json = JSON.stringify(signons);
// console.log(json);
var xmlEnd = '</pwlist>\n';
filoutputStream.write(xmlEnd, xmlEnd.length);
filoutputStream.close();
/*
* This is a JavaScript Scratchpad.
*
* Enter some JavaScript, then Right Click or choose from the Execute Menu:
* 1. Run to evaluate the selected text (Ctrl+R),
* 2. Inspect to bring up an Object Inspector on the result (Ctrl+I), or,
* 3. Display to insert the result in a comment after the selection. (Ctrl+L)
*/
var {
classes: Cc,
interfaces: Ci
}
= Components;
var tokendb = Cc['@mozilla.org/security/pk11tokendb;1'].createInstance(Ci.nsIPK11TokenDB);
var token = tokendb.getInternalKeyToken();
try {
token.login(true);
} catch (e) {
}
var passwordmanager = Cc['@mozilla.org/login-manager;1'].getService(Ci.nsILoginManager);
var signons = passwordmanager.getAllLogins({
});
var json = JSON.stringify(signons);
// console.log("lala");
function escapeXml(unsafe) {
if (!unsafe) {
return '';
}
return unsafe.replace(/[<>&'"]/g, function (c) {
switch (c) {
case '<':
return '&lt;';
case '>':
return '&gt;';
case '&':
return '&amp;';
case '\'':
return '&apos;';
case '"':
return '&quot;';
}
});
}
var result = ""
var xmlHeader = '<?xml version="1.0" encoding="UTF-8"?>\n<pwlist>\n';
result += xmlHeader;
for (var i = 0; i < signons.length; i++) {
var host = escapeXml(signons[i].hostname);
var password = escapeXml(signons[i].password);
var user = escapeXml(signons[i].username);
// put into notes
var userf = escapeXml(signons[i].usernameField);
var passwordf = escapeXml(signons[i].passwordField);
var submiturl = escapeXml(signons[i].formSubmitURL);
var realm = escapeXml(signons[i].httpRealm);
// build xml
var group = '\t<group>Firefox</group>\n';
var title = '\t<title>' + user + '@' + host + '</title>\n';
var username = '\t<username>' + user + '</username>\n';
var url = '\t<url>' + host + '</url>\n' // TODO: escape
var pwd = '\t<password>' + password + '</password>\n'
var notes = '\t<notes>\n\t\t' + userf + '\n\t\t' + passwordf + '\n\t\t' + submiturl + '\t\t\n' + realm + '\n</notes>\n';
// TODO: <uuid>4d9a9420ac7c4a8ae688762eac8871a9</uuid>
var entryStart = '<pwentry>\n';
result += entryStart;
result += group;
result += title;
result += username;
result += url;
result += pwd;
result += notes;
var entryEnd = '</pwentry>\n';
result += entryEnd;
}
//var json = JSON.stringify(signons);
//console.log(json);
var xmlEnd = '</pwlist>\n';
result += xmlEnd;
console.log(result);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment