Last active
June 13, 2019 13:09
-
-
Save franziskuskiefer/00c096ce9727fbc602e1e2575395c350 to your computer and use it in GitHub Desktop.
export passwords from Firefox password manager
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function escapeXml(unsafe) { | |
if (!unsafe) { | |
return ''; | |
} | |
return unsafe.replace(/[<>&'"]/g, function (c) { | |
switch (c) { | |
case '<': | |
return '<'; | |
case '>': | |
return '>'; | |
case '&': | |
return '&'; | |
case '\'': | |
return '''; | |
case '"': | |
return '"'; | |
} | |
}); | |
} | |
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 file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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 '<'; | |
case '>': | |
return '>'; | |
case '&': | |
return '&'; | |
case '\'': | |
return '''; | |
case '"': | |
return '"'; | |
} | |
}); | |
} | |
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